blob: 4093833e0be114c94962ba8308f71d9c7b3969ee [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"
Andreas Gampe170331f2017-12-07 18:41:03 -080035#include "base/logging.h" // For VLOG
Brian Carlstrom7940e442013-07-12 13:46:57 -070036#include "base/stl_util.h"
Mathieu Chartier32ce2ad2016-03-04 14:58:03 -080037#include "base/systrace.h"
Vladimir Marko80afd022015-05-19 18:08:00 +010038#include "base/time_utils.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070039#include "base/timing_logger.h"
Vladimir Marko3481ba22015-04-13 12:22:36 +010040#include "class_linker-inl.h"
Vladimir Markod8dbc8d2017-09-20 13:37:47 +010041#include "compiled_method-inl.h"
Nicolas Geoffrayb34f69a2014-03-07 15:28:39 +000042#include "compiler.h"
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +000043#include "compiler_callbacks.h"
Vladimir Markobe0e5462014-02-26 11:24:15 +000044#include "compiler_driver-inl.h"
David Sehrb2ec9f52018-02-21 13:20:31 -080045#include "dex/descriptors_names.h"
David Sehr9e734c72018-01-04 17:56:19 -080046#include "dex/dex_file-inl.h"
47#include "dex/dex_file_annotations.h"
48#include "dex/dex_instruction-inl.h"
Andreas Gampe5eb0d382015-07-23 01:19:26 -070049#include "dex/dex_to_dex_compiler.h"
Vladimir Markoc7f83202014-01-24 17:55:18 +000050#include "dex/verification_results.h"
Vladimir Marko2730db02014-01-27 11:15:17 +000051#include "dex/verified_method.h"
Steven Morelande431e272017-07-18 16:53:49 -070052#include "dex_compilation_unit.h"
Mark Mendellae9fd932014-02-10 16:14:35 -080053#include "driver/compiler_options.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070054#include "gc/accounting/card_table-inl.h"
55#include "gc/accounting/heap_bitmap.h"
Mathieu Chartiere401d142015-04-22 13:56:20 -070056#include "gc/space/image_space.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070057#include "gc/space/space.h"
Steven Morelande431e272017-07-18 16:53:49 -070058#include "handle_scope-inl.h"
59#include "intrinsics_enum.h"
Andreas Gampe3913e482018-01-22 18:58:01 -080060#include "jit/profile_compilation_info.h"
Steven Morelande431e272017-07-18 16:53:49 -070061#include "jni_internal.h"
Vladimir Markod8dbc8d2017-09-20 13:37:47 +010062#include "linker/linker_patch.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070063#include "mirror/class-inl.h"
Steven Morelande431e272017-07-18 16:53:49 -070064#include "mirror/class_loader.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070065#include "mirror/dex_cache-inl.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070066#include "mirror/object-inl.h"
Andreas Gampec6ea7d02017-02-01 16:46:28 -080067#include "mirror/object-refvisitor-inl.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070068#include "mirror/object_array-inl.h"
69#include "mirror/throwable.h"
Steven Morelande431e272017-07-18 16:53:49 -070070#include "nativehelper/ScopedLocalRef.h"
71#include "object_lock.h"
72#include "runtime.h"
Orion Hodson26ef34c2017-11-01 13:32:41 +000073#include "runtime_intrinsics.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070074#include "scoped_thread_state_change-inl.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070075#include "thread.h"
Andreas Gampeb0f370e2014-09-25 22:51:40 -070076#include "thread_list.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070077#include "thread_pool.h"
Ian Rogers848871b2013-08-05 10:56:33 -070078#include "trampolines/trampoline_compiler.h"
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010079#include "transaction.h"
Mathieu Chartier93764b82017-07-17 14:51:53 -070080#include "utils/atomic_dex_ref_map-inl.h"
Vladimir Marko20f85592015-03-19 10:07:02 +000081#include "utils/dex_cache_arrays_layout-inl.h"
Andreas Gampee21dc3d2014-12-08 16:59:43 -080082#include "utils/swap_space.h"
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +000083#include "vdex_file.h"
Vladimir Marko2bc47802014-02-10 09:43:07 +000084#include "verifier/method_verifier-inl.h"
Steven Morelande431e272017-07-18 16:53:49 -070085#include "verifier/method_verifier.h"
Nicolas Geoffray08025182016-10-25 17:20:18 +010086#include "verifier/verifier_deps.h"
Andreas Gampe6d7abbd2017-04-24 13:19:09 -070087#include "verifier/verifier_enums.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070088
Brian Carlstrom7940e442013-07-12 13:46:57 -070089namespace art {
90
Mathieu Chartier8e219ae2014-08-19 14:29:46 -070091static constexpr bool kTimeCompileMethod = !kIsDebugBuild;
92
Calin Juravle226501b2015-12-11 14:41:31 +000093// Print additional info during profile guided compilation.
94static constexpr bool kDebugProfileGuidedCompilation = false;
95
Chang Xing70f689d2017-06-08 17:16:12 -070096// Max encoded fields allowed for initializing app image. Hardcode the number for now
97// because 5000 should be large enough.
98static constexpr uint32_t kMaxEncodedFields = 5000;
99
Brian Carlstrom7940e442013-07-12 13:46:57 -0700100static double Percentage(size_t x, size_t y) {
101 return 100.0 * (static_cast<double>(x)) / (static_cast<double>(x + y));
102}
103
104static void DumpStat(size_t x, size_t y, const char* str) {
105 if (x == 0 && y == 0) {
106 return;
107 }
Ian Rogerse732ef12013-10-09 15:22:24 -0700108 LOG(INFO) << Percentage(x, y) << "% of " << str << " for " << (x + y) << " cases";
Brian Carlstrom7940e442013-07-12 13:46:57 -0700109}
110
Vladimir Markof096aad2014-01-23 15:51:58 +0000111class CompilerDriver::AOTCompilationStats {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700112 public:
113 AOTCompilationStats()
114 : stats_lock_("AOT compilation statistics lock"),
Brian Carlstrom7940e442013-07-12 13:46:57 -0700115 resolved_types_(0), unresolved_types_(0),
116 resolved_instance_fields_(0), unresolved_instance_fields_(0),
117 resolved_local_static_fields_(0), resolved_static_fields_(0), unresolved_static_fields_(0),
118 type_based_devirtualization_(0),
119 safe_casts_(0), not_safe_casts_(0) {
120 for (size_t i = 0; i <= kMaxInvokeType; i++) {
121 resolved_methods_[i] = 0;
122 unresolved_methods_[i] = 0;
123 virtual_made_direct_[i] = 0;
124 direct_calls_to_boot_[i] = 0;
125 direct_methods_to_boot_[i] = 0;
126 }
127 }
128
129 void Dump() {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700130 DumpStat(resolved_types_, unresolved_types_, "types resolved");
131 DumpStat(resolved_instance_fields_, unresolved_instance_fields_, "instance fields resolved");
132 DumpStat(resolved_local_static_fields_ + resolved_static_fields_, unresolved_static_fields_,
133 "static fields resolved");
134 DumpStat(resolved_local_static_fields_, resolved_static_fields_ + unresolved_static_fields_,
135 "static fields local to a class");
136 DumpStat(safe_casts_, not_safe_casts_, "check-casts removed based on type information");
137 // Note, the code below subtracts the stat value so that when added to the stat value we have
138 // 100% of samples. TODO: clean this up.
139 DumpStat(type_based_devirtualization_,
140 resolved_methods_[kVirtual] + unresolved_methods_[kVirtual] +
141 resolved_methods_[kInterface] + unresolved_methods_[kInterface] -
142 type_based_devirtualization_,
143 "virtual/interface calls made direct based on type information");
144
145 for (size_t i = 0; i <= kMaxInvokeType; i++) {
146 std::ostringstream oss;
147 oss << static_cast<InvokeType>(i) << " methods were AOT resolved";
148 DumpStat(resolved_methods_[i], unresolved_methods_[i], oss.str().c_str());
149 if (virtual_made_direct_[i] > 0) {
150 std::ostringstream oss2;
151 oss2 << static_cast<InvokeType>(i) << " methods made direct";
152 DumpStat(virtual_made_direct_[i],
153 resolved_methods_[i] + unresolved_methods_[i] - virtual_made_direct_[i],
154 oss2.str().c_str());
155 }
156 if (direct_calls_to_boot_[i] > 0) {
157 std::ostringstream oss2;
158 oss2 << static_cast<InvokeType>(i) << " method calls are direct into boot";
159 DumpStat(direct_calls_to_boot_[i],
160 resolved_methods_[i] + unresolved_methods_[i] - direct_calls_to_boot_[i],
161 oss2.str().c_str());
162 }
163 if (direct_methods_to_boot_[i] > 0) {
164 std::ostringstream oss2;
165 oss2 << static_cast<InvokeType>(i) << " method calls have methods in boot";
166 DumpStat(direct_methods_to_boot_[i],
167 resolved_methods_[i] + unresolved_methods_[i] - direct_methods_to_boot_[i],
168 oss2.str().c_str());
169 }
170 }
171 }
172
173// Allow lossy statistics in non-debug builds.
174#ifndef NDEBUG
175#define STATS_LOCK() MutexLock mu(Thread::Current(), stats_lock_)
176#else
177#define STATS_LOCK()
178#endif
179
Mathieu Chartier90443472015-07-16 20:32:27 -0700180 void TypeDoesntNeedAccessCheck() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700181 STATS_LOCK();
182 resolved_types_++;
183 }
184
Mathieu Chartier90443472015-07-16 20:32:27 -0700185 void TypeNeedsAccessCheck() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700186 STATS_LOCK();
187 unresolved_types_++;
188 }
189
Mathieu Chartier90443472015-07-16 20:32:27 -0700190 void ResolvedInstanceField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700191 STATS_LOCK();
192 resolved_instance_fields_++;
193 }
194
Mathieu Chartier90443472015-07-16 20:32:27 -0700195 void UnresolvedInstanceField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700196 STATS_LOCK();
197 unresolved_instance_fields_++;
198 }
199
Mathieu Chartier90443472015-07-16 20:32:27 -0700200 void ResolvedLocalStaticField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700201 STATS_LOCK();
202 resolved_local_static_fields_++;
203 }
204
Mathieu Chartier90443472015-07-16 20:32:27 -0700205 void ResolvedStaticField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700206 STATS_LOCK();
207 resolved_static_fields_++;
208 }
209
Mathieu Chartier90443472015-07-16 20:32:27 -0700210 void UnresolvedStaticField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700211 STATS_LOCK();
212 unresolved_static_fields_++;
213 }
214
215 // Indicate that type information from the verifier led to devirtualization.
Mathieu Chartier90443472015-07-16 20:32:27 -0700216 void PreciseTypeDevirtualization() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700217 STATS_LOCK();
218 type_based_devirtualization_++;
219 }
220
Brian Carlstrom7940e442013-07-12 13:46:57 -0700221 // A check-cast could be eliminated due to verifier type analysis.
Mathieu Chartier90443472015-07-16 20:32:27 -0700222 void SafeCast() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700223 STATS_LOCK();
224 safe_casts_++;
225 }
226
227 // A check-cast couldn't be eliminated due to verifier type analysis.
Mathieu Chartier90443472015-07-16 20:32:27 -0700228 void NotASafeCast() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700229 STATS_LOCK();
230 not_safe_casts_++;
231 }
232
233 private:
234 Mutex stats_lock_;
235
Brian Carlstrom7940e442013-07-12 13:46:57 -0700236 size_t resolved_types_;
237 size_t unresolved_types_;
238
239 size_t resolved_instance_fields_;
240 size_t unresolved_instance_fields_;
241
242 size_t resolved_local_static_fields_;
243 size_t resolved_static_fields_;
244 size_t unresolved_static_fields_;
245 // Type based devirtualization for invoke interface and virtual.
246 size_t type_based_devirtualization_;
247
248 size_t resolved_methods_[kMaxInvokeType + 1];
249 size_t unresolved_methods_[kMaxInvokeType + 1];
250 size_t virtual_made_direct_[kMaxInvokeType + 1];
251 size_t direct_calls_to_boot_[kMaxInvokeType + 1];
252 size_t direct_methods_to_boot_[kMaxInvokeType + 1];
253
254 size_t safe_casts_;
255 size_t not_safe_casts_;
256
257 DISALLOW_COPY_AND_ASSIGN(AOTCompilationStats);
258};
259
Jeff Haodcdc85b2015-12-04 14:06:18 -0800260CompilerDriver::CompilerDriver(
261 const CompilerOptions* compiler_options,
262 VerificationResults* verification_results,
Jeff Haodcdc85b2015-12-04 14:06:18 -0800263 Compiler::Kind compiler_kind,
264 InstructionSet instruction_set,
265 const InstructionSetFeatures* instruction_set_features,
Vladimir Marko944da602016-02-19 12:27:55 +0000266 std::unordered_set<std::string>* image_classes,
Jeff Haodcdc85b2015-12-04 14:06:18 -0800267 std::unordered_set<std::string>* compiled_classes,
268 std::unordered_set<std::string>* compiled_methods,
Vladimir Marko944da602016-02-19 12:27:55 +0000269 size_t thread_count,
Vladimir Marko944da602016-02-19 12:27:55 +0000270 int swap_fd,
Calin Juravle998c2162015-12-21 15:39:33 +0200271 const ProfileCompilationInfo* profile_compilation_info)
Calin Juravle226501b2015-12-11 14:41:31 +0000272 : compiler_options_(compiler_options),
Brian Carlstrom6449c622014-02-10 23:48:36 -0800273 verification_results_(verification_results),
Ian Rogers72d32622014-05-06 16:20:11 -0700274 compiler_(Compiler::Create(this, compiler_kind)),
Jeff Hao48699fb2015-04-06 14:21:37 -0700275 compiler_kind_(compiler_kind),
Vladimir Marko33bff252017-11-01 14:35:42 +0000276 instruction_set_(
277 instruction_set == InstructionSet::kArm ? InstructionSet::kThumb2 : instruction_set),
Dave Allison70202782013-10-22 17:52:19 -0700278 instruction_set_features_(instruction_set_features),
Mathieu Chartierc4ae9162016-04-07 13:19:19 -0700279 requires_constructor_barrier_lock_("constructor barrier lock"),
Vladimir Markof4da6752014-08-01 19:04:18 +0100280 non_relative_linker_patch_count_(0u),
Brian Carlstrom7940e442013-07-12 13:46:57 -0700281 image_classes_(image_classes),
Andreas Gampe4bf3ae92014-11-11 13:28:29 -0800282 classes_to_compile_(compiled_classes),
Andreas Gampe70bef0d2015-04-15 02:37:28 -0700283 methods_to_compile_(compiled_methods),
Andreas Gampef39208f2017-10-19 15:06:59 -0700284 number_of_soft_verifier_failures_(0),
Andreas Gampe6cf49e52015-03-05 13:08:45 -0800285 had_hard_verifier_failure_(false),
Andreas Gampeace0dc12016-01-20 13:33:13 -0800286 parallel_thread_count_(thread_count),
Brian Carlstrom7940e442013-07-12 13:46:57 -0700287 stats_(new AOTCompilationStats),
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700288 compiler_context_(nullptr),
Alexey Frunze19f6c692016-11-30 19:19:55 -0800289 support_boot_image_fixup_(true),
Calin Juravle998c2162015-12-21 15:39:33 +0200290 compiled_method_storage_(swap_fd),
Calin Juravle69158982016-03-16 11:53:41 +0000291 profile_compilation_info_(profile_compilation_info),
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100292 max_arena_alloc_(0),
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800293 dex_to_dex_compiler_(this) {
Brian Carlstrom6449c622014-02-10 23:48:36 -0800294 DCHECK(compiler_options_ != nullptr);
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700295
Ian Rogers72d32622014-05-06 16:20:11 -0700296 compiler_->Init();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700297
Vladimir Markoaad75c62016-10-03 08:46:48 +0000298 if (GetCompilerOptions().IsBootImage()) {
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800299 CHECK(image_classes_.get() != nullptr) << "Expected image classes for boot image";
300 }
Andreas Gampecac31ad2017-11-06 20:01:17 -0800301
302 compiled_method_storage_.SetDedupeEnabled(compiler_options_->DeduplicateCode());
Brian Carlstrom7940e442013-07-12 13:46:57 -0700303}
304
305CompilerDriver::~CompilerDriver() {
Mathieu Chartier93764b82017-07-17 14:51:53 -0700306 compiled_methods_.Visit([this](const DexFileReference& ref ATTRIBUTE_UNUSED,
Mathieu Chartieracab8d42016-11-23 13:45:58 -0800307 CompiledMethod* method) {
308 if (method != nullptr) {
309 CompiledMethod::ReleaseSwapAllocatedCompiledMethod(this, method);
Andreas Gampee21dc3d2014-12-08 16:59:43 -0800310 }
Mathieu Chartieracab8d42016-11-23 13:45:58 -0800311 });
Ian Rogers72d32622014-05-06 16:20:11 -0700312 compiler_->UnInit();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700313}
314
Vladimir Marko35831e82015-09-11 11:59:18 +0100315
Ian Rogersdd7624d2014-03-14 17:43:00 -0700316#define CREATE_TRAMPOLINE(type, abi, offset) \
Andreas Gampeaf13ad92014-04-11 12:07:48 -0700317 if (Is64BitInstructionSet(instruction_set_)) { \
Ian Rogersdd7624d2014-03-14 17:43:00 -0700318 return CreateTrampoline64(instruction_set_, abi, \
Andreas Gampe542451c2016-07-26 09:02:02 -0700319 type ## _ENTRYPOINT_OFFSET(PointerSize::k64, offset)); \
Ian Rogersdd7624d2014-03-14 17:43:00 -0700320 } else { \
321 return CreateTrampoline32(instruction_set_, abi, \
Andreas Gampe542451c2016-07-26 09:02:02 -0700322 type ## _ENTRYPOINT_OFFSET(PointerSize::k32, offset)); \
Ian Rogersdd7624d2014-03-14 17:43:00 -0700323 }
324
Vladimir Marko93205e32016-04-13 11:59:46 +0100325std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateJniDlsymLookup() const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700326 CREATE_TRAMPOLINE(JNI, kJniAbi, pDlsymLookup)
Ian Rogers848871b2013-08-05 10:56:33 -0700327}
328
Vladimir Marko93205e32016-04-13 11:59:46 +0100329std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickGenericJniTrampoline()
330 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700331 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickGenericJniTrampoline)
Andreas Gampe2da88232014-02-27 12:26:20 -0800332}
333
Vladimir Marko93205e32016-04-13 11:59:46 +0100334std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickImtConflictTrampoline()
335 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700336 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickImtConflictTrampoline)
Jeff Hao88474b42013-10-23 16:24:40 -0700337}
338
Vladimir Marko93205e32016-04-13 11:59:46 +0100339std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickResolutionTrampoline()
340 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700341 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickResolutionTrampoline)
Brian Carlstrom7940e442013-07-12 13:46:57 -0700342}
343
Vladimir Marko93205e32016-04-13 11:59:46 +0100344std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickToInterpreterBridge()
345 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700346 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickToInterpreterBridge)
Brian Carlstrom7940e442013-07-12 13:46:57 -0700347}
Ian Rogersdd7624d2014-03-14 17:43:00 -0700348#undef CREATE_TRAMPOLINE
Brian Carlstrom7940e442013-07-12 13:46:57 -0700349
350void CompilerDriver::CompileAll(jobject class_loader,
Brian Carlstrom45602482013-07-21 22:07:55 -0700351 const std::vector<const DexFile*>& dex_files,
Ian Rogers3d504072014-03-01 09:16:49 -0800352 TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700353 DCHECK(!Runtime::Current()->IsStarted());
Andreas Gampeace0dc12016-01-20 13:33:13 -0800354
355 InitializeThreadPools();
356
Andreas Gampe8d295f82015-01-20 14:50:21 -0800357 VLOG(compiler) << "Before precompile " << GetMemoryUsageString(false);
Andreas Gampe740667a2015-09-15 17:55:06 -0700358 // Precompile:
359 // 1) Load image classes
360 // 2) Resolve all classes
361 // 3) Attempt to verify all classes
362 // 4) Attempt to initialize image classes, and trivially initialized classes
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +0000363 PreCompile(class_loader, dex_files, timings);
Vladimir Markoaad75c62016-10-03 08:46:48 +0000364 if (GetCompilerOptions().IsBootImage()) {
Nicolas Geoffray762869d2016-07-15 15:28:35 +0100365 // We don't need to setup the intrinsics for non boot image compilation, as
366 // those compilations will pick up a boot image that have the ArtMethod already
367 // set with the intrinsics flag.
Orion Hodson26ef34c2017-11-01 13:32:41 +0000368 InitializeIntrinsics();
Nicolas Geoffray762869d2016-07-15 15:28:35 +0100369 }
Andreas Gampe740667a2015-09-15 17:55:06 -0700370 // Compile:
371 // 1) Compile all classes and methods enabled for compilation. May fall back to dex-to-dex
372 // compilation.
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100373 if (GetCompilerOptions().IsAnyCompilationEnabled()) {
Andreas Gampeace0dc12016-01-20 13:33:13 -0800374 Compile(class_loader, dex_files, timings);
Andreas Gampe740667a2015-09-15 17:55:06 -0700375 }
Nicolas Geoffray2d8801f2017-11-28 15:50:07 +0000376 if (GetCompilerOptions().GetDumpStats()) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700377 stats_->Dump();
378 }
Andreas Gampeace0dc12016-01-20 13:33:13 -0800379
380 FreeThreadPools();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700381}
382
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800383static optimizer::DexToDexCompiler::CompilationLevel GetDexToDexCompilationLevel(
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700384 Thread* self, const CompilerDriver& driver, Handle<mirror::ClassLoader> class_loader,
385 const DexFile& dex_file, const DexFile::ClassDef& class_def)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700386 REQUIRES_SHARED(Locks::mutator_lock_) {
Nicolas Geoffrayf3075272018-01-08 12:41:19 +0000387 // When the dex file is uncompressed in the APK, we do not generate a copy in the .vdex
388 // file. As a result, dex2oat will map the dex file read-only, and we only need to check
389 // that to know if we can do quickening.
390 if (dex_file.GetContainer() != nullptr && dex_file.GetContainer()->IsReadOnly()) {
391 return optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
392 }
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800393 auto* const runtime = Runtime::Current();
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100394 DCHECK(driver.GetCompilerOptions().IsQuickeningCompilationEnabled());
Brian Carlstrom7940e442013-07-12 13:46:57 -0700395 const char* descriptor = dex_file.GetClassDescriptor(class_def);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800396 ClassLinker* class_linker = runtime->GetClassLinker();
Ian Rogers98379392014-02-24 16:53:16 -0800397 mirror::Class* klass = class_linker->FindClass(self, descriptor, class_loader);
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700398 if (klass == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700399 CHECK(self->IsExceptionPending());
400 self->ClearException();
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800401 return optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
Brian Carlstrom7940e442013-07-12 13:46:57 -0700402 }
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700403 // DexToDex at the kOptimize level may introduce quickened opcodes, which replace symbolic
404 // references with actual offsets. We cannot re-verify such instructions.
405 //
406 // We store the verification information in the class status in the oat file, which the linker
407 // can validate (checksums) and use to skip load-time verification. It is thus safe to
408 // optimize when a class has been fully verified before.
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800409 optimizer::DexToDexCompiler::CompilationLevel max_level =
410 optimizer::DexToDexCompiler::CompilationLevel::kOptimize;
Alex Lighte40dd382017-01-25 17:44:53 -0800411 if (driver.GetCompilerOptions().GetDebuggable()) {
412 // We are debuggable so definitions of classes might be changed. We don't want to do any
413 // optimizations that could break that.
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800414 max_level = optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
Alex Lighte40dd382017-01-25 17:44:53 -0800415 }
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700416 if (klass->IsVerified()) {
Sebastien Hertz75021222013-07-16 18:34:50 +0200417 // Class is verified so we can enable DEX-to-DEX compilation for performance.
Alex Lighte40dd382017-01-25 17:44:53 -0800418 return max_level;
Sebastien Hertz75021222013-07-16 18:34:50 +0200419 } else {
Andreas Gampe1a4bc7f2017-03-27 14:57:30 -0700420 // Class verification has failed: do not run DEX-to-DEX optimizations.
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800421 return optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700422 }
423}
424
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800425static optimizer::DexToDexCompiler::CompilationLevel GetDexToDexCompilationLevel(
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700426 Thread* self,
427 const CompilerDriver& driver,
428 jobject jclass_loader,
429 const DexFile& dex_file,
430 const DexFile::ClassDef& class_def) {
431 ScopedObjectAccess soa(self);
432 StackHandleScope<1> hs(soa.Self());
433 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700434 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700435 return GetDexToDexCompilationLevel(self, driver, class_loader, dex_file, class_def);
436}
437
438// Does the runtime for the InstructionSet provide an implementation returned by
439// GetQuickGenericJniStub allowing down calls that aren't compiled using a JNI compiler?
440static bool InstructionSetHasGenericJniStub(InstructionSet isa) {
441 switch (isa) {
Vladimir Marko33bff252017-11-01 14:35:42 +0000442 case InstructionSet::kArm:
443 case InstructionSet::kArm64:
444 case InstructionSet::kThumb2:
445 case InstructionSet::kMips:
446 case InstructionSet::kMips64:
447 case InstructionSet::kX86:
448 case InstructionSet::kX86_64: return true;
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700449 default: return false;
450 }
451}
452
Andreas Gampe3c060ad2018-01-22 13:07:49 -0800453template <typename CompileFn>
454static void CompileMethodHarness(
455 Thread* self,
456 CompilerDriver* driver,
457 const DexFile::CodeItem* code_item,
458 uint32_t access_flags,
459 InvokeType invoke_type,
460 uint16_t class_def_idx,
461 uint32_t method_idx,
462 Handle<mirror::ClassLoader> class_loader,
463 const DexFile& dex_file,
464 optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
465 bool compilation_enabled,
466 Handle<mirror::DexCache> dex_cache,
467 CompileFn compile_fn) {
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700468 DCHECK(driver != nullptr);
Andreas Gampe3c060ad2018-01-22 13:07:49 -0800469 CompiledMethod* compiled_method;
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700470 uint64_t start_ns = kTimeCompileMethod ? NanoTime() : 0;
471 MethodReference method_ref(&dex_file, method_idx);
472
Andreas Gampe3c060ad2018-01-22 13:07:49 -0800473 compiled_method = compile_fn(self,
474 driver,
475 code_item,
476 access_flags,
477 invoke_type,
478 class_def_idx,
479 method_idx,
480 class_loader,
481 dex_file,
482 dex_to_dex_compilation_level,
483 compilation_enabled,
484 dex_cache);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700485
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700486 if (kTimeCompileMethod) {
487 uint64_t duration_ns = NanoTime() - start_ns;
488 if (duration_ns > MsToNs(driver->GetCompiler()->GetMaximumCompilationTimeBeforeWarning())) {
David Sehr709b0702016-10-13 09:12:37 -0700489 LOG(WARNING) << "Compilation of " << dex_file.PrettyMethod(method_idx)
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700490 << " took " << PrettyDuration(duration_ns);
491 }
492 }
493
494 if (compiled_method != nullptr) {
495 // Count non-relative linker patches.
496 size_t non_relative_linker_patch_count = 0u;
Vladimir Markod8dbc8d2017-09-20 13:37:47 +0100497 for (const linker::LinkerPatch& patch : compiled_method->GetPatches()) {
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700498 if (!patch.IsPcRelative()) {
499 ++non_relative_linker_patch_count;
500 }
501 }
502 bool compile_pic = driver->GetCompilerOptions().GetCompilePic(); // Off by default
503 // When compiling with PIC, there should be zero non-relative linker patches
504 CHECK(!compile_pic || non_relative_linker_patch_count == 0u);
505
506 driver->AddCompiledMethod(method_ref, compiled_method, non_relative_linker_patch_count);
507 }
508
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700509 if (self->IsExceptionPending()) {
510 ScopedObjectAccess soa(self);
David Sehr709b0702016-10-13 09:12:37 -0700511 LOG(FATAL) << "Unexpected exception compiling: " << dex_file.PrettyMethod(method_idx) << "\n"
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700512 << self->GetException()->Dump();
Sebastien Hertz75021222013-07-16 18:34:50 +0200513 }
Brian Carlstrom7940e442013-07-12 13:46:57 -0700514}
515
Andreas Gampe3c060ad2018-01-22 13:07:49 -0800516static void CompileMethodDex2Dex(
517 Thread* self,
518 CompilerDriver* driver,
519 const DexFile::CodeItem* code_item,
520 uint32_t access_flags,
521 InvokeType invoke_type,
522 uint16_t class_def_idx,
523 uint32_t method_idx,
524 Handle<mirror::ClassLoader> class_loader,
525 const DexFile& dex_file,
526 optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
527 bool compilation_enabled,
528 Handle<mirror::DexCache> dex_cache) {
529 auto dex_2_dex_fn = [](Thread* self ATTRIBUTE_UNUSED,
530 CompilerDriver* driver,
531 const DexFile::CodeItem* code_item,
532 uint32_t access_flags,
533 InvokeType invoke_type,
534 uint16_t class_def_idx,
535 uint32_t method_idx,
536 Handle<mirror::ClassLoader> class_loader,
537 const DexFile& dex_file,
538 optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
539 bool compilation_enabled ATTRIBUTE_UNUSED,
540 Handle<mirror::DexCache> dex_cache ATTRIBUTE_UNUSED) -> CompiledMethod* {
541 DCHECK(driver != nullptr);
542 MethodReference method_ref(&dex_file, method_idx);
543
544 optimizer::DexToDexCompiler* const compiler = &driver->GetDexToDexCompiler();
545
546 if (compiler->ShouldCompileMethod(method_ref)) {
547 VerificationResults* results = driver->GetVerificationResults();
548 DCHECK(results != nullptr);
549 const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref);
550 // Do not optimize if a VerifiedMethod is missing. SafeCast elision,
551 // for example, relies on it.
552 return compiler->CompileMethod(
553 code_item,
554 access_flags,
555 invoke_type,
556 class_def_idx,
557 method_idx,
558 class_loader,
559 dex_file,
560 (verified_method != nullptr)
561 ? dex_to_dex_compilation_level
562 : optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile);
563 }
564 return nullptr;
565 };
566 CompileMethodHarness(self,
567 driver,
568 code_item,
569 access_flags,
570 invoke_type,
571 class_def_idx,
572 method_idx,
573 class_loader,
574 dex_file,
575 dex_to_dex_compilation_level,
576 compilation_enabled,
577 dex_cache,
578 dex_2_dex_fn);
579}
580
581static void CompileMethodQuick(
582 Thread* self,
583 CompilerDriver* driver,
584 const DexFile::CodeItem* code_item,
585 uint32_t access_flags,
586 InvokeType invoke_type,
587 uint16_t class_def_idx,
588 uint32_t method_idx,
589 Handle<mirror::ClassLoader> class_loader,
590 const DexFile& dex_file,
591 optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
592 bool compilation_enabled,
593 Handle<mirror::DexCache> dex_cache) {
594 auto quick_fn = [](
595 Thread* self,
596 CompilerDriver* driver,
597 const DexFile::CodeItem* code_item,
598 uint32_t access_flags,
599 InvokeType invoke_type,
600 uint16_t class_def_idx,
601 uint32_t method_idx,
602 Handle<mirror::ClassLoader> class_loader,
603 const DexFile& dex_file,
604 optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
605 bool compilation_enabled,
606 Handle<mirror::DexCache> dex_cache) {
607 DCHECK(driver != nullptr);
608 CompiledMethod* compiled_method = nullptr;
609 MethodReference method_ref(&dex_file, method_idx);
610
611 if ((access_flags & kAccNative) != 0) {
612 // Are we extracting only and have support for generic JNI down calls?
613 if (!driver->GetCompilerOptions().IsJniCompilationEnabled() &&
614 InstructionSetHasGenericJniStub(driver->GetInstructionSet())) {
615 // Leaving this empty will trigger the generic JNI version
616 } else {
617 // Query any JNI optimization annotations such as @FastNative or @CriticalNative.
618 access_flags |= annotations::GetNativeMethodAnnotationAccessFlags(
619 dex_file, dex_file.GetClassDef(class_def_idx), method_idx);
620
621 compiled_method = driver->GetCompiler()->JniCompile(
622 access_flags, method_idx, dex_file, dex_cache);
623 CHECK(compiled_method != nullptr);
624 }
625 } else if ((access_flags & kAccAbstract) != 0) {
626 // Abstract methods don't have code.
627 } else {
628 VerificationResults* results = driver->GetVerificationResults();
629 DCHECK(results != nullptr);
630 const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref);
631 bool compile = compilation_enabled &&
632 // Basic checks, e.g., not <clinit>.
633 results->IsCandidateForCompilation(method_ref, access_flags) &&
634 // Did not fail to create VerifiedMethod metadata.
635 verified_method != nullptr &&
636 // Do not have failures that should punt to the interpreter.
637 !verified_method->HasRuntimeThrow() &&
638 (verified_method->GetEncounteredVerificationFailures() &
639 (verifier::VERIFY_ERROR_FORCE_INTERPRETER | verifier::VERIFY_ERROR_LOCKING)) == 0 &&
640 // Is eligable for compilation by methods-to-compile filter.
641 driver->IsMethodToCompile(method_ref) &&
642 driver->ShouldCompileBasedOnProfile(method_ref);
643
644 if (compile) {
645 // NOTE: if compiler declines to compile this method, it will return null.
646 compiled_method = driver->GetCompiler()->Compile(code_item,
647 access_flags,
648 invoke_type,
649 class_def_idx,
650 method_idx,
651 class_loader,
652 dex_file,
653 dex_cache);
654 }
655 if (compiled_method == nullptr &&
656 dex_to_dex_compilation_level !=
657 optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile) {
658 DCHECK(!Runtime::Current()->UseJitCompilation());
659 // TODO: add a command-line option to disable DEX-to-DEX compilation ?
Mathieu Chartier279e3a32018-01-24 18:17:55 -0800660 driver->GetDexToDexCompiler().MarkForCompilation(self, method_ref);
Andreas Gampe3c060ad2018-01-22 13:07:49 -0800661 }
662 }
663 return compiled_method;
664 };
665 CompileMethodHarness(self,
666 driver,
667 code_item,
668 access_flags,
669 invoke_type,
670 class_def_idx,
671 method_idx,
672 class_loader,
673 dex_file,
674 dex_to_dex_compilation_level,
675 compilation_enabled,
676 dex_cache,
677 quick_fn);
678}
679
Mathieu Chartiere401d142015-04-22 13:56:20 -0700680void CompilerDriver::CompileOne(Thread* self, ArtMethod* method, TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700681 DCHECK(!Runtime::Current()->IsStarted());
Brian Carlstrom7940e442013-07-12 13:46:57 -0700682 jobject jclass_loader;
683 const DexFile* dex_file;
Ian Rogers8b2c0b92013-09-19 02:56:49 -0700684 uint16_t class_def_idx;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800685 uint32_t method_idx = method->GetDexMethodIndex();
686 uint32_t access_flags = method->GetAccessFlags();
687 InvokeType invoke_type = method->GetInvokeType();
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000688 StackHandleScope<2> hs(self);
Mathieu Chartier736b5602015-09-02 14:54:11 -0700689 Handle<mirror::DexCache> dex_cache(hs.NewHandle(method->GetDexCache()));
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000690 Handle<mirror::ClassLoader> class_loader(
691 hs.NewHandle(method->GetDeclaringClass()->GetClassLoader()));
Brian Carlstrom7940e442013-07-12 13:46:57 -0700692 {
693 ScopedObjectAccessUnchecked soa(self);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800694 ScopedLocalRef<jobject> local_class_loader(
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000695 soa.Env(), soa.AddLocalReference<jobject>(class_loader.Get()));
Brian Carlstrom7940e442013-07-12 13:46:57 -0700696 jclass_loader = soa.Env()->NewGlobalRef(local_class_loader.get());
697 // Find the dex_file
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700698 dex_file = method->GetDexFile();
699 class_def_idx = method->GetClassDefIndex();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700700 }
Ian Rogersef7d42f2014-01-06 12:55:46 -0800701 const DexFile::CodeItem* code_item = dex_file->GetCodeItem(method->GetCodeItemOffset());
Mathieu Chartier736b5602015-09-02 14:54:11 -0700702
703 // Go to native so that we don't block GC during compilation.
Mathieu Chartierf1d666e2015-09-03 16:13:34 -0700704 ScopedThreadSuspension sts(self, kNative);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700705
706 std::vector<const DexFile*> dex_files;
707 dex_files.push_back(dex_file);
708
Andreas Gampeace0dc12016-01-20 13:33:13 -0800709 InitializeThreadPools();
710
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +0000711 PreCompile(jclass_loader, dex_files, timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700712
Brian Carlstrom7940e442013-07-12 13:46:57 -0700713 // Can we run DEX-to-DEX compiler on this class ?
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800714 optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level =
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700715 GetDexToDexCompilationLevel(self,
716 *this,
717 jclass_loader,
718 *dex_file,
719 dex_file->GetClassDef(class_def_idx));
720
Andreas Gampe3c060ad2018-01-22 13:07:49 -0800721 CompileMethodQuick(self,
722 this,
723 code_item,
724 access_flags,
725 invoke_type,
726 class_def_idx,
727 method_idx,
728 class_loader,
729 *dex_file,
730 dex_to_dex_compilation_level,
731 true,
732 dex_cache);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700733
Mathieu Chartier279e3a32018-01-24 18:17:55 -0800734 const size_t num_methods = dex_to_dex_compiler_.NumCodeItemsToQuicken(self);
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800735 if (num_methods != 0) {
736 DCHECK_EQ(num_methods, 1u);
Andreas Gampe3c060ad2018-01-22 13:07:49 -0800737 CompileMethodDex2Dex(self,
738 this,
739 code_item,
740 access_flags,
741 invoke_type,
742 class_def_idx,
743 method_idx,
744 class_loader,
745 *dex_file,
746 dex_to_dex_compilation_level,
747 true,
748 dex_cache);
Mathieu Chartiera79efdb2018-01-18 16:31:01 -0800749 dex_to_dex_compiler_.ClearState();
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100750 }
751
Andreas Gampeace0dc12016-01-20 13:33:13 -0800752 FreeThreadPools();
753
Brian Carlstrom7940e442013-07-12 13:46:57 -0700754 self->GetJniEnv()->DeleteGlobalRef(jclass_loader);
Mathieu Chartier2535abe2015-02-17 10:38:49 -0800755}
756
Andreas Gampeace0dc12016-01-20 13:33:13 -0800757void CompilerDriver::Resolve(jobject class_loader,
758 const std::vector<const DexFile*>& dex_files,
759 TimingLogger* timings) {
760 // Resolution allocates classes and needs to run single-threaded to be deterministic.
761 bool force_determinism = GetCompilerOptions().IsForceDeterminism();
762 ThreadPool* resolve_thread_pool = force_determinism
763 ? single_thread_pool_.get()
764 : parallel_thread_pool_.get();
765 size_t resolve_thread_count = force_determinism ? 1U : parallel_thread_count_;
766
Brian Carlstrom7940e442013-07-12 13:46:57 -0700767 for (size_t i = 0; i != dex_files.size(); ++i) {
768 const DexFile* dex_file = dex_files[i];
Kenny Rootd5185342014-05-13 14:47:05 -0700769 CHECK(dex_file != nullptr);
Andreas Gampeace0dc12016-01-20 13:33:13 -0800770 ResolveDexFile(class_loader,
771 *dex_file,
772 dex_files,
773 resolve_thread_pool,
774 resolve_thread_count,
775 timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700776 }
777}
778
Andreas Gampeace0dc12016-01-20 13:33:13 -0800779// Resolve const-strings in the code. Done to have deterministic allocation behavior. Right now
780// this is single-threaded for simplicity.
781// TODO: Collect the relevant string indices in parallel, then allocate them sequentially in a
782// stable order.
783
Vladimir Marko175e7862018-03-27 09:03:13 +0000784static void ResolveConstStrings(ClassLinker* class_linker,
785 Handle<mirror::DexCache> dex_cache,
Mathieu Chartier6238c832018-01-04 09:55:13 -0800786 const DexFile& dex_file,
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000787 const DexFile::CodeItem* code_item)
788 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeace0dc12016-01-20 13:33:13 -0800789 if (code_item == nullptr) {
790 // Abstract or native method.
791 return;
792 }
793
Mathieu Chartier698ebbc2018-01-05 11:00:42 -0800794 for (const DexInstructionPcPair& inst : CodeItemInstructionAccessor(dex_file, code_item)) {
Mathieu Chartier2b2bef22017-10-26 17:10:19 -0700795 switch (inst->Opcode()) {
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000796 case Instruction::CONST_STRING:
Andreas Gampeace0dc12016-01-20 13:33:13 -0800797 case Instruction::CONST_STRING_JUMBO: {
Mathieu Chartier2b2bef22017-10-26 17:10:19 -0700798 dex::StringIndex string_index((inst->Opcode() == Instruction::CONST_STRING)
799 ? inst->VRegB_21c()
800 : inst->VRegB_31c());
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000801 ObjPtr<mirror::String> string = class_linker->ResolveString(string_index, dex_cache);
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000802 CHECK(string != nullptr) << "Could not allocate a string when forcing determinism";
Andreas Gampeace0dc12016-01-20 13:33:13 -0800803 break;
804 }
805
806 default:
807 break;
808 }
Andreas Gampeace0dc12016-01-20 13:33:13 -0800809 }
810}
811
812static void ResolveConstStrings(CompilerDriver* driver,
813 const std::vector<const DexFile*>& dex_files,
814 TimingLogger* timings) {
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000815 ScopedObjectAccess soa(Thread::Current());
816 StackHandleScope<1> hs(soa.Self());
817 ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
818 MutableHandle<mirror::DexCache> dex_cache(hs.NewHandle<mirror::DexCache>(nullptr));
819
Andreas Gampeace0dc12016-01-20 13:33:13 -0800820 for (const DexFile* dex_file : dex_files) {
Vladimir Markocd556b02017-02-03 11:47:34 +0000821 dex_cache.Assign(class_linker->FindDexCache(soa.Self(), *dex_file));
Andreas Gampeace0dc12016-01-20 13:33:13 -0800822 TimingLogger::ScopedTiming t("Resolve const-string Strings", timings);
823
824 size_t class_def_count = dex_file->NumClassDefs();
825 for (size_t class_def_index = 0; class_def_index < class_def_count; ++class_def_index) {
826 const DexFile::ClassDef& class_def = dex_file->GetClassDef(class_def_index);
827
828 const uint8_t* class_data = dex_file->GetClassData(class_def);
829 if (class_data == nullptr) {
830 // empty class, probably a marker interface
831 continue;
832 }
833
834 ClassDataItemIterator it(*dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -0700835 it.SkipAllFields();
Andreas Gampeace0dc12016-01-20 13:33:13 -0800836
837 bool compilation_enabled = driver->IsClassToCompile(
838 dex_file->StringByTypeIdx(class_def.class_idx_));
839 if (!compilation_enabled) {
840 // Compilation is skipped, do not resolve const-string in code of this class.
Vladimir Marko175e7862018-03-27 09:03:13 +0000841 // FIXME: Make sure that inlining honors this. b/26687569
Andreas Gampeace0dc12016-01-20 13:33:13 -0800842 continue;
843 }
844
Mathieu Chartierb7c273c2017-11-10 18:07:56 -0800845 // Direct and virtual methods.
Mathieu Chartierb7c273c2017-11-10 18:07:56 -0800846 while (it.HasNextMethod()) {
Vladimir Marko175e7862018-03-27 09:03:13 +0000847 ResolveConstStrings(class_linker, dex_cache, *dex_file, it.GetMethodCodeItem());
848 it.Next();
849 }
850 DCHECK(!it.HasNext());
851 }
852 }
853}
854
855// Initialize type check bit strings for check-cast and instance-of in the code. Done to have
856// deterministic allocation behavior. Right now this is single-threaded for simplicity.
857// TODO: Collect the relevant type indices in parallel, then process them sequentially in a
858// stable order.
859
860static void InitializeTypeCheckBitstrings(CompilerDriver* driver,
861 ClassLinker* class_linker,
862 Handle<mirror::DexCache> dex_cache,
863 const DexFile& dex_file,
864 const DexFile::CodeItem* code_item)
865 REQUIRES_SHARED(Locks::mutator_lock_) {
866 if (code_item == nullptr) {
867 // Abstract or native method.
868 return;
869 }
870
871 for (const DexInstructionPcPair& inst : CodeItemInstructionAccessor(dex_file, code_item)) {
872 switch (inst->Opcode()) {
873 case Instruction::CHECK_CAST:
874 case Instruction::INSTANCE_OF: {
875 dex::TypeIndex type_index(
876 (inst->Opcode() == Instruction::CHECK_CAST) ? inst->VRegB_21c() : inst->VRegC_22c());
877 const char* descriptor = dex_file.StringByTypeIdx(type_index);
878 // We currently do not use the bitstring type check for array or final (including
879 // primitive) classes. We may reconsider this in future if it's deemed to be beneficial.
880 // And we cannot use it for classes outside the boot image as we do not know the runtime
881 // value of their bitstring when compiling (it may not even get assigned at runtime).
882 if (descriptor[0] == 'L' && driver->IsImageClass(descriptor)) {
883 ObjPtr<mirror::Class> klass =
884 class_linker->LookupResolvedType(type_index,
885 dex_cache.Get(),
886 /* class_loader */ nullptr);
887 CHECK(klass != nullptr) << descriptor << " should have been previously resolved.";
888 // Now assign the bitstring if the class is not final. Keep this in sync with sharpening.
889 if (!klass->IsFinal()) {
890 MutexLock subtype_check_lock(Thread::Current(), *Locks::subtype_check_lock_);
891 SubtypeCheck<ObjPtr<mirror::Class>>::EnsureAssigned(klass);
892 }
Andreas Gampeace0dc12016-01-20 13:33:13 -0800893 }
Vladimir Marko175e7862018-03-27 09:03:13 +0000894 break;
895 }
896
897 default:
898 break;
899 }
900 }
901}
902
903static void InitializeTypeCheckBitstrings(CompilerDriver* driver,
904 const std::vector<const DexFile*>& dex_files,
905 TimingLogger* timings) {
906 ScopedObjectAccess soa(Thread::Current());
907 StackHandleScope<1> hs(soa.Self());
908 ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
909 MutableHandle<mirror::DexCache> dex_cache(hs.NewHandle<mirror::DexCache>(nullptr));
910
911 for (const DexFile* dex_file : dex_files) {
912 dex_cache.Assign(class_linker->FindDexCache(soa.Self(), *dex_file));
913 TimingLogger::ScopedTiming t("Initialize type check bitstrings", timings);
914
915 size_t class_def_count = dex_file->NumClassDefs();
916 for (size_t class_def_index = 0; class_def_index < class_def_count; ++class_def_index) {
917 const DexFile::ClassDef& class_def = dex_file->GetClassDef(class_def_index);
918
919 const uint8_t* class_data = dex_file->GetClassData(class_def);
920 if (class_data == nullptr) {
921 // empty class, probably a marker interface
922 continue;
923 }
924
925 ClassDataItemIterator it(*dex_file, class_data);
926 it.SkipAllFields();
927
928 bool compilation_enabled = driver->IsClassToCompile(
929 dex_file->StringByTypeIdx(class_def.class_idx_));
930 if (!compilation_enabled) {
931 // Compilation is skipped, do not look for type checks in code of this class.
932 // FIXME: Make sure that inlining honors this. b/26687569
933 continue;
934 }
935
936 // Direct and virtual methods.
937 while (it.HasNextMethod()) {
938 InitializeTypeCheckBitstrings(
939 driver, class_linker, dex_cache, *dex_file, it.GetMethodCodeItem());
Andreas Gampeace0dc12016-01-20 13:33:13 -0800940 it.Next();
941 }
942 DCHECK(!it.HasNext());
943 }
944 }
945}
946
947inline void CompilerDriver::CheckThreadPools() {
948 DCHECK(parallel_thread_pool_ != nullptr);
949 DCHECK(single_thread_pool_ != nullptr);
950}
951
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +0000952static void EnsureVerifiedOrVerifyAtRuntime(jobject jclass_loader,
953 const std::vector<const DexFile*>& dex_files) {
954 ScopedObjectAccess soa(Thread::Current());
955 StackHandleScope<2> hs(soa.Self());
956 Handle<mirror::ClassLoader> class_loader(
957 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
958 MutableHandle<mirror::Class> cls(hs.NewHandle<mirror::Class>(nullptr));
959 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
960
961 for (const DexFile* dex_file : dex_files) {
962 for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
963 const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
964 const char* descriptor = dex_file->GetClassDescriptor(class_def);
965 cls.Assign(class_linker->FindClass(soa.Self(), descriptor, class_loader));
Andreas Gampefa4333d2017-02-14 11:10:34 -0800966 if (cls == nullptr) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +0000967 soa.Self()->ClearException();
968 } else if (&cls->GetDexFile() == dex_file) {
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +0000969 DCHECK(cls->IsErroneous() || cls->IsVerified() || cls->ShouldVerifyAtRuntime())
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +0000970 << cls->PrettyClass()
971 << " " << cls->GetStatus();
972 }
973 }
974 }
975}
976
Andreas Gampeace0dc12016-01-20 13:33:13 -0800977void CompilerDriver::PreCompile(jobject class_loader,
978 const std::vector<const DexFile*>& dex_files,
979 TimingLogger* timings) {
980 CheckThreadPools();
981
Brian Carlstrom7940e442013-07-12 13:46:57 -0700982 LoadImageClasses(timings);
Andreas Gampe8d295f82015-01-20 14:50:21 -0800983 VLOG(compiler) << "LoadImageClasses: " << GetMemoryUsageString(false);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700984
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100985 if (compiler_options_->IsAnyCompilationEnabled()) {
Mathieu Chartier88b74b62017-07-16 17:08:19 -0700986 // Avoid adding the dex files in the case where we aren't going to add compiled methods.
987 // This reduces RAM usage for this case.
988 for (const DexFile* dex_file : dex_files) {
989 // Can be already inserted if the caller is CompileOne. This happens for gtests.
990 if (!compiled_methods_.HaveDexFile(dex_file)) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -0700991 compiled_methods_.AddDexFile(dex_file);
Mathieu Chartier88b74b62017-07-16 17:08:19 -0700992 }
993 }
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100994 // Resolve eagerly to prepare for compilation.
Andreas Gampeace0dc12016-01-20 13:33:13 -0800995 Resolve(class_loader, dex_files, timings);
Mathieu Chartiere86deef2015-03-19 13:43:37 -0700996 VLOG(compiler) << "Resolve: " << GetMemoryUsageString(false);
997 }
998
Nicolas Geoffray60ca9492016-12-20 21:15:00 +0000999 if (compiler_options_->AssumeClassesAreVerified()) {
Mathieu Chartierab972ef2014-12-03 17:38:22 -08001000 VLOG(compiler) << "Verify none mode specified, skipping verification.";
Andreas Gampeace0dc12016-01-20 13:33:13 -08001001 SetVerified(class_loader, dex_files, timings);
Mathieu Chartiere86deef2015-03-19 13:43:37 -07001002 }
1003
Nicolas Geoffray60ca9492016-12-20 21:15:00 +00001004 if (!compiler_options_->IsVerificationEnabled()) {
Jeff Hao4a200f52014-04-01 14:58:49 -07001005 return;
1006 }
1007
Vladimir Markoaad75c62016-10-03 08:46:48 +00001008 if (GetCompilerOptions().IsForceDeterminism() && GetCompilerOptions().IsBootImage()) {
Andreas Gampeace0dc12016-01-20 13:33:13 -08001009 // Resolve strings from const-string. Do this now to have a deterministic image.
1010 ResolveConstStrings(this, dex_files, timings);
1011 VLOG(compiler) << "Resolve const-strings: " << GetMemoryUsageString(false);
1012 }
1013
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +00001014 Verify(class_loader, dex_files, timings);
Andreas Gampe8d295f82015-01-20 14:50:21 -08001015 VLOG(compiler) << "Verify: " << GetMemoryUsageString(false);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001016
Andreas Gampe6cf49e52015-03-05 13:08:45 -08001017 if (had_hard_verifier_failure_ && GetCompilerOptions().AbortOnHardVerifierFailure()) {
Andreas Gampefdfb4d42017-07-27 12:12:22 -07001018 // Avoid dumping threads. Even if we shut down the thread pools, there will still be three
1019 // instances of this thread's stack.
1020 LOG(FATAL_WITHOUT_ABORT) << "Had a hard failure verifying all classes, and was asked to abort "
1021 << "in such situations. Please check the log.";
Andreas Gampe56c9b7c2018-02-27 18:49:26 -08001022 _exit(1);
Andreas Gampef39208f2017-10-19 15:06:59 -07001023 } else if (number_of_soft_verifier_failures_ > 0 &&
1024 GetCompilerOptions().AbortOnSoftVerifierFailure()) {
1025 LOG(FATAL_WITHOUT_ABORT) << "Had " << number_of_soft_verifier_failures_ << " soft failure(s) "
1026 << "verifying all classes, and was asked to abort in such situations. "
1027 << "Please check the log.";
Andreas Gampe56c9b7c2018-02-27 18:49:26 -08001028 _exit(1);
Andreas Gampe6cf49e52015-03-05 13:08:45 -08001029 }
1030
Nicolas Geoffray49cda062017-04-21 13:08:25 +01001031 if (compiler_options_->IsAnyCompilationEnabled()) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001032 if (kIsDebugBuild) {
1033 EnsureVerifiedOrVerifyAtRuntime(class_loader, dex_files);
1034 }
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00001035 InitializeClasses(class_loader, dex_files, timings);
1036 VLOG(compiler) << "InitializeClasses: " << GetMemoryUsageString(false);
1037 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001038
1039 UpdateImageClasses(timings);
Andreas Gampe8d295f82015-01-20 14:50:21 -08001040 VLOG(compiler) << "UpdateImageClasses: " << GetMemoryUsageString(false);
Vladimir Marko175e7862018-03-27 09:03:13 +00001041
1042 if (kBitstringSubtypeCheckEnabled &&
1043 GetCompilerOptions().IsForceDeterminism() && GetCompilerOptions().IsBootImage()) {
1044 // Initialize type check bit string used by check-cast and instanceof.
1045 // Do this now to have a deterministic image.
1046 // Note: This is done after UpdateImageClasses() at it relies on the image classes to be final.
1047 InitializeTypeCheckBitstrings(this, dex_files, timings);
1048 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001049}
1050
Ian Rogersdfb325e2013-10-30 01:00:44 -07001051bool CompilerDriver::IsImageClass(const char* descriptor) const {
Mathieu Chartierc5dd3192015-12-09 16:38:30 -08001052 if (image_classes_ != nullptr) {
1053 // If we have a set of image classes, use those.
Ian Rogersdfb325e2013-10-30 01:00:44 -07001054 return image_classes_->find(descriptor) != image_classes_->end();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001055 }
Mathieu Chartierc5dd3192015-12-09 16:38:30 -08001056 // No set of image classes, assume we include all the classes.
1057 // NOTE: Currently only reachable from InitImageMethodVisitor for the app image case.
Vladimir Markoaad75c62016-10-03 08:46:48 +00001058 return !GetCompilerOptions().IsBootImage();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001059}
1060
Andreas Gampe4bf3ae92014-11-11 13:28:29 -08001061bool CompilerDriver::IsClassToCompile(const char* descriptor) const {
Andreas Gampeb1fcead2015-04-20 18:53:51 -07001062 if (classes_to_compile_ == nullptr) {
1063 return true;
1064 }
1065 return classes_to_compile_->find(descriptor) != classes_to_compile_->end();
Andreas Gampe4bf3ae92014-11-11 13:28:29 -08001066}
1067
Andreas Gampe70bef0d2015-04-15 02:37:28 -07001068bool CompilerDriver::IsMethodToCompile(const MethodReference& method_ref) const {
Andreas Gampe70bef0d2015-04-15 02:37:28 -07001069 if (methods_to_compile_ == nullptr) {
1070 return true;
1071 }
1072
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07001073 std::string tmp = method_ref.PrettyMethod();
Andreas Gampe70bef0d2015-04-15 02:37:28 -07001074 return methods_to_compile_->find(tmp.c_str()) != methods_to_compile_->end();
1075}
1076
Calin Juravle226501b2015-12-11 14:41:31 +00001077bool CompilerDriver::ShouldCompileBasedOnProfile(const MethodReference& method_ref) const {
Mathieu Chartier97ab5e32017-02-22 13:35:44 -08001078 // Profile compilation info may be null if no profile is passed.
Mathieu Chartierd0af56c2017-02-17 12:56:25 -08001079 if (!CompilerFilter::DependsOnProfile(compiler_options_->GetCompilerFilter())) {
1080 // Use the compiler filter instead of the presence of profile_compilation_info_ since
1081 // we may want to have full speed compilation along with profile based layout optimizations.
Calin Juravle226501b2015-12-11 14:41:31 +00001082 return true;
1083 }
Mathieu Chartier97ab5e32017-02-22 13:35:44 -08001084 // If we are using a profile filter but do not have a profile compilation info, compile nothing.
1085 if (profile_compilation_info_ == nullptr) {
1086 return false;
1087 }
Mathieu Chartier7b135c82017-06-05 12:54:01 -07001088 // Compile only hot methods, it is the profile saver's job to decide what startup methods to mark
1089 // as hot.
Mathieu Chartierbbe3a5e2017-06-13 16:36:17 -07001090 bool result = profile_compilation_info_->GetMethodHotness(method_ref).IsHot();
Calin Juravle226501b2015-12-11 14:41:31 +00001091
1092 if (kDebugProfileGuidedCompilation) {
1093 LOG(INFO) << "[ProfileGuidedCompilation] "
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07001094 << (result ? "Compiled" : "Skipped") << " method:" << method_ref.PrettyMethod(true);
Calin Juravle226501b2015-12-11 14:41:31 +00001095 }
1096 return result;
1097}
1098
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001099class ResolveCatchBlockExceptionsClassVisitor : public ClassVisitor {
1100 public:
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001101 ResolveCatchBlockExceptionsClassVisitor() : classes_() {}
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001102
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001103 virtual bool operator()(ObjPtr<mirror::Class> c) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001104 classes_.push_back(c);
Mathieu Chartiere4275c02015-08-06 15:34:15 -07001105 return true;
1106 }
1107
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001108 void FindExceptionTypesToResolve(
1109 std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve)
Vladimir Markobfb80d22017-02-14 14:08:12 +00001110 REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001111 const auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
1112 for (ObjPtr<mirror::Class> klass : classes_) {
1113 for (ArtMethod& method : klass->GetMethods(pointer_size)) {
1114 FindExceptionTypesToResolveForMethod(&method, exceptions_to_resolve);
1115 }
1116 }
1117 }
1118
1119 private:
1120 void FindExceptionTypesToResolveForMethod(
1121 ArtMethod* method,
1122 std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve)
1123 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier808c7a52017-12-15 11:19:33 -08001124 if (method->GetCodeItem() == nullptr) {
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001125 return; // native or abstract method
Brian Carlstrom7940e442013-07-12 13:46:57 -07001126 }
David Sehr0225f8e2018-01-31 08:52:24 +00001127 CodeItemDataAccessor accessor(method->DexInstructionData());
Mathieu Chartier808c7a52017-12-15 11:19:33 -08001128 if (accessor.TriesSize() == 0) {
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001129 return; // nothing to process
1130 }
Mathieu Chartier808c7a52017-12-15 11:19:33 -08001131 const uint8_t* encoded_catch_handler_list = accessor.GetCatchHandlerData();
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001132 size_t num_encoded_catch_handlers = DecodeUnsignedLeb128(&encoded_catch_handler_list);
1133 for (size_t i = 0; i < num_encoded_catch_handlers; i++) {
1134 int32_t encoded_catch_handler_size = DecodeSignedLeb128(&encoded_catch_handler_list);
1135 bool has_catch_all = false;
1136 if (encoded_catch_handler_size <= 0) {
1137 encoded_catch_handler_size = -encoded_catch_handler_size;
1138 has_catch_all = true;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001139 }
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001140 for (int32_t j = 0; j < encoded_catch_handler_size; j++) {
Andreas Gampea5b09a62016-11-17 15:21:22 -08001141 dex::TypeIndex encoded_catch_handler_handlers_type_idx =
1142 dex::TypeIndex(DecodeUnsignedLeb128(&encoded_catch_handler_list));
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001143 // Add to set of types to resolve if not already in the dex cache resolved types
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001144 if (!method->IsResolvedTypeIdx(encoded_catch_handler_handlers_type_idx)) {
1145 exceptions_to_resolve->emplace(encoded_catch_handler_handlers_type_idx,
1146 method->GetDexFile());
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001147 }
1148 // ignore address associated with catch handler
1149 DecodeUnsignedLeb128(&encoded_catch_handler_list);
1150 }
1151 if (has_catch_all) {
1152 // ignore catch all address
1153 DecodeUnsignedLeb128(&encoded_catch_handler_list);
1154 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001155 }
1156 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001157
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001158 std::vector<ObjPtr<mirror::Class>> classes_;
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001159};
1160
1161class RecordImageClassesVisitor : public ClassVisitor {
1162 public:
1163 explicit RecordImageClassesVisitor(std::unordered_set<std::string>* image_classes)
1164 : image_classes_(image_classes) {}
1165
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001166 bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001167 std::string temp;
1168 image_classes_->insert(klass->GetDescriptor(&temp));
1169 return true;
1170 }
1171
1172 private:
1173 std::unordered_set<std::string>* const image_classes_;
1174};
Brian Carlstrom7940e442013-07-12 13:46:57 -07001175
1176// Make a list of descriptors for classes to include in the image
Mathieu Chartier90443472015-07-16 20:32:27 -07001177void CompilerDriver::LoadImageClasses(TimingLogger* timings) {
Kenny Rootd5185342014-05-13 14:47:05 -07001178 CHECK(timings != nullptr);
Vladimir Markoaad75c62016-10-03 08:46:48 +00001179 if (!GetCompilerOptions().IsBootImage()) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001180 return;
1181 }
1182
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001183 TimingLogger::ScopedTiming t("LoadImageClasses", timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001184 // Make a first class to load all classes explicitly listed in the file
1185 Thread* self = Thread::Current();
1186 ScopedObjectAccess soa(self);
1187 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
Kenny Rootd5185342014-05-13 14:47:05 -07001188 CHECK(image_classes_.get() != nullptr);
Mathieu Chartier02e25112013-08-14 16:14:24 -07001189 for (auto it = image_classes_->begin(), end = image_classes_->end(); it != end;) {
Vladimir Markoe9c36b32013-11-21 15:49:16 +00001190 const std::string& descriptor(*it);
Mathieu Chartiereb8167a2014-05-07 15:43:14 -07001191 StackHandleScope<1> hs(self);
1192 Handle<mirror::Class> klass(
1193 hs.NewHandle(class_linker->FindSystemClass(self, descriptor.c_str())));
Andreas Gampefa4333d2017-02-14 11:10:34 -08001194 if (klass == nullptr) {
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001195 VLOG(compiler) << "Failed to find class " << descriptor;
Vladimir Markoe9c36b32013-11-21 15:49:16 +00001196 image_classes_->erase(it++);
Ian Rogersa436fde2013-08-27 23:34:06 -07001197 self->ClearException();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001198 } else {
1199 ++it;
1200 }
1201 }
1202
1203 // Resolve exception classes referenced by the loaded classes. The catch logic assumes
1204 // exceptions are resolved by the verifier when there is a catch block in an interested method.
1205 // Do this here so that exception classes appear to have been specified image classes.
Andreas Gampea5b09a62016-11-17 15:21:22 -08001206 std::set<std::pair<dex::TypeIndex, const DexFile*>> unresolved_exception_types;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -07001207 StackHandleScope<1> hs(self);
1208 Handle<mirror::Class> java_lang_Throwable(
1209 hs.NewHandle(class_linker->FindSystemClass(self, "Ljava/lang/Throwable;")));
Brian Carlstrom7940e442013-07-12 13:46:57 -07001210 do {
1211 unresolved_exception_types.clear();
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001212 {
1213 // Thread suspension is not allowed while ResolveCatchBlockExceptionsClassVisitor
1214 // is using a std::vector<ObjPtr<mirror::Class>>.
1215 ScopedAssertNoThreadSuspension ants(__FUNCTION__);
1216 ResolveCatchBlockExceptionsClassVisitor visitor;
1217 class_linker->VisitClasses(&visitor);
1218 visitor.FindExceptionTypesToResolve(&unresolved_exception_types);
1219 }
Andreas Gampea5b09a62016-11-17 15:21:22 -08001220 for (const auto& exception_type : unresolved_exception_types) {
1221 dex::TypeIndex exception_type_idx = exception_type.first;
Mathieu Chartier02e25112013-08-14 16:14:24 -07001222 const DexFile* dex_file = exception_type.second;
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001223 StackHandleScope<1> hs2(self);
Mathieu Chartierf284d442016-06-02 11:48:30 -07001224 Handle<mirror::DexCache> dex_cache(hs2.NewHandle(class_linker->RegisterDexFile(*dex_file,
1225 nullptr)));
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001226 ObjPtr<mirror::Class> klass =
Andreas Gampefa4333d2017-02-14 11:10:34 -08001227 (dex_cache != nullptr)
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001228 ? class_linker->ResolveType(exception_type_idx,
Vladimir Markocd556b02017-02-03 11:47:34 +00001229 dex_cache,
1230 ScopedNullHandle<mirror::ClassLoader>())
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001231 : nullptr;
Andreas Gampefa4333d2017-02-14 11:10:34 -08001232 if (klass == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001233 const DexFile::TypeId& type_id = dex_file->GetTypeId(exception_type_idx);
1234 const char* descriptor = dex_file->GetTypeDescriptor(type_id);
1235 LOG(FATAL) << "Failed to resolve class " << descriptor;
1236 }
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001237 DCHECK(java_lang_Throwable->IsAssignableFrom(klass));
Brian Carlstrom7940e442013-07-12 13:46:57 -07001238 }
1239 // Resolving exceptions may load classes that reference more exceptions, iterate until no
1240 // more are found
1241 } while (!unresolved_exception_types.empty());
1242
1243 // We walk the roots looking for classes so that we'll pick up the
1244 // above classes plus any classes them depend on such super
1245 // classes, interfaces, and the required ClassLinker roots.
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001246 RecordImageClassesVisitor visitor(image_classes_.get());
1247 class_linker->VisitClasses(&visitor);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001248
1249 CHECK_NE(image_classes_->size(), 0U);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001250}
1251
Vladimir Marko19a4d372016-12-08 14:41:46 +00001252static void MaybeAddToImageClasses(Thread* self,
1253 ObjPtr<mirror::Class> klass,
Andreas Gampeb1fcead2015-04-20 18:53:51 -07001254 std::unordered_set<std::string>* image_classes)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001255 REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Marko19a4d372016-12-08 14:41:46 +00001256 DCHECK_EQ(self, Thread::Current());
Mathieu Chartierf8322842014-05-16 10:59:25 -07001257 StackHandleScope<1> hs(self);
Ian Rogers1ff3c982014-08-12 02:30:58 -07001258 std::string temp;
Andreas Gampe542451c2016-07-26 09:02:02 -07001259 const PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001260 while (!klass->IsObjectClass()) {
Ian Rogers1ff3c982014-08-12 02:30:58 -07001261 const char* descriptor = klass->GetDescriptor(&temp);
Andreas Gampeb1fcead2015-04-20 18:53:51 -07001262 std::pair<std::unordered_set<std::string>::iterator, bool> result =
1263 image_classes->insert(descriptor);
Ian Rogers1ff3c982014-08-12 02:30:58 -07001264 if (!result.second) { // Previously inserted.
1265 break;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001266 }
Ian Rogers1ff3c982014-08-12 02:30:58 -07001267 VLOG(compiler) << "Adding " << descriptor << " to image classes";
Vladimir Marko19a4d372016-12-08 14:41:46 +00001268 for (size_t i = 0, num_interfaces = klass->NumDirectInterfaces(); i != num_interfaces; ++i) {
1269 ObjPtr<mirror::Class> interface = mirror::Class::GetDirectInterface(self, klass, i);
1270 DCHECK(interface != nullptr);
1271 MaybeAddToImageClasses(self, interface, image_classes);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001272 }
Vladimir Marko19a4d372016-12-08 14:41:46 +00001273 for (auto& m : klass->GetVirtualMethods(pointer_size)) {
1274 MaybeAddToImageClasses(self, m.GetDeclaringClass(), image_classes);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001275 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001276 if (klass->IsArrayClass()) {
Vladimir Marko19a4d372016-12-08 14:41:46 +00001277 MaybeAddToImageClasses(self, klass->GetComponentType(), image_classes);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001278 }
Mathieu Chartierf8322842014-05-16 10:59:25 -07001279 klass.Assign(klass->GetSuperClass());
Brian Carlstrom7940e442013-07-12 13:46:57 -07001280 }
1281}
1282
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001283// Keeps all the data for the update together. Also doubles as the reference visitor.
1284// Note: we can use object pointers because we suspend all threads.
1285class ClinitImageUpdate {
1286 public:
Mathieu Chartier31e88222016-10-14 18:43:19 -07001287 static ClinitImageUpdate* Create(VariableSizedHandleScope& hs,
1288 std::unordered_set<std::string>* image_class_descriptors,
1289 Thread* self,
1290 ClassLinker* linker) {
1291 std::unique_ptr<ClinitImageUpdate> res(new ClinitImageUpdate(hs,
1292 image_class_descriptors,
1293 self,
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001294 linker));
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001295 return res.release();
1296 }
1297
1298 ~ClinitImageUpdate() {
1299 // Allow others to suspend again.
1300 self_->EndAssertNoThreadSuspension(old_cause_);
1301 }
1302
1303 // Visitor for VisitReferences.
Mathieu Chartier31e88222016-10-14 18:43:19 -07001304 void operator()(ObjPtr<mirror::Object> object,
1305 MemberOffset field_offset,
1306 bool /* is_static */) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001307 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001308 mirror::Object* ref = object->GetFieldObject<mirror::Object>(field_offset);
1309 if (ref != nullptr) {
1310 VisitClinitClassesObject(ref);
1311 }
1312 }
1313
Roland Levillain5e8d5f02016-10-18 18:03:43 +01001314 // java.lang.ref.Reference visitor for VisitReferences.
Mathieu Chartier31e88222016-10-14 18:43:19 -07001315 void operator()(ObjPtr<mirror::Class> klass ATTRIBUTE_UNUSED,
1316 ObjPtr<mirror::Reference> ref ATTRIBUTE_UNUSED) const {}
Mathieu Chartierda7c6502015-07-23 16:01:26 -07001317
1318 // Ignore class native roots.
1319 void VisitRootIfNonNull(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED)
1320 const {}
1321 void VisitRoot(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED) const {}
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001322
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001323 void Walk() REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001324 // Use the initial classes as roots for a search.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001325 for (Handle<mirror::Class> klass_root : image_classes_) {
1326 VisitClinitClassesObject(klass_root.Get());
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001327 }
Vladimir Marko19a4d372016-12-08 14:41:46 +00001328 Thread* self = Thread::Current();
1329 ScopedAssertNoThreadSuspension ants(__FUNCTION__);
Mathieu Chartier31e88222016-10-14 18:43:19 -07001330 for (Handle<mirror::Class> h_klass : to_insert_) {
Vladimir Marko19a4d372016-12-08 14:41:46 +00001331 MaybeAddToImageClasses(self, h_klass.Get(), image_class_descriptors_);
Mathieu Chartier31e88222016-10-14 18:43:19 -07001332 }
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001333 }
1334
1335 private:
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001336 class FindImageClassesVisitor : public ClassVisitor {
1337 public:
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001338 explicit FindImageClassesVisitor(VariableSizedHandleScope& hs,
1339 ClinitImageUpdate* data)
1340 : data_(data),
1341 hs_(hs) {}
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001342
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001343 bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001344 std::string temp;
1345 const char* name = klass->GetDescriptor(&temp);
1346 if (data_->image_class_descriptors_->find(name) != data_->image_class_descriptors_->end()) {
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001347 data_->image_classes_.push_back(hs_.NewHandle(klass));
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001348 } else {
1349 // Check whether it is initialized and has a clinit. They must be kept, too.
1350 if (klass->IsInitialized() && klass->FindClassInitializer(
1351 Runtime::Current()->GetClassLinker()->GetImagePointerSize()) != nullptr) {
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001352 data_->image_classes_.push_back(hs_.NewHandle(klass));
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001353 }
1354 }
1355 return true;
1356 }
1357
1358 private:
1359 ClinitImageUpdate* const data_;
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001360 VariableSizedHandleScope& hs_;
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001361 };
1362
Mathieu Chartier31e88222016-10-14 18:43:19 -07001363 ClinitImageUpdate(VariableSizedHandleScope& hs,
1364 std::unordered_set<std::string>* image_class_descriptors,
1365 Thread* self,
1366 ClassLinker* linker) REQUIRES_SHARED(Locks::mutator_lock_)
1367 : hs_(hs),
1368 image_class_descriptors_(image_class_descriptors),
1369 self_(self) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001370 CHECK(linker != nullptr);
1371 CHECK(image_class_descriptors != nullptr);
1372
1373 // Make sure nobody interferes with us.
1374 old_cause_ = self->StartAssertNoThreadSuspension("Boot image closure");
1375
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001376 // Find all the already-marked classes.
1377 WriterMutexLock mu(self, *Locks::heap_bitmap_lock_);
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001378 FindImageClassesVisitor visitor(hs_, this);
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001379 linker->VisitClasses(&visitor);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001380 }
1381
1382 void VisitClinitClassesObject(mirror::Object* object) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001383 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001384 DCHECK(object != nullptr);
1385 if (marked_objects_.find(object) != marked_objects_.end()) {
1386 // Already processed.
1387 return;
1388 }
1389
1390 // Mark it.
1391 marked_objects_.insert(object);
1392
1393 if (object->IsClass()) {
Mathieu Chartier31e88222016-10-14 18:43:19 -07001394 // Add to the TODO list since MaybeAddToImageClasses may cause thread suspension. Thread
1395 // suspensionb is not safe to do in VisitObjects or VisitReferences.
1396 to_insert_.push_back(hs_.NewHandle(object->AsClass()));
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001397 } else {
1398 // Else visit the object's class.
1399 VisitClinitClassesObject(object->GetClass());
1400 }
1401
Mathieu Chartiere401d142015-04-22 13:56:20 -07001402 // If it is not a DexCache, visit all references.
Mathieu Chartier31e88222016-10-14 18:43:19 -07001403 if (!object->IsDexCache()) {
Mathieu Chartier059ef3d2015-08-18 13:54:21 -07001404 object->VisitReferences(*this, *this);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001405 }
1406 }
1407
Mathieu Chartier31e88222016-10-14 18:43:19 -07001408 VariableSizedHandleScope& hs_;
1409 mutable std::vector<Handle<mirror::Class>> to_insert_;
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001410 mutable std::unordered_set<mirror::Object*> marked_objects_;
Andreas Gampeb1fcead2015-04-20 18:53:51 -07001411 std::unordered_set<std::string>* const image_class_descriptors_;
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001412 std::vector<Handle<mirror::Class>> image_classes_;
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001413 Thread* const self_;
1414 const char* old_cause_;
1415
1416 DISALLOW_COPY_AND_ASSIGN(ClinitImageUpdate);
1417};
Brian Carlstrom7940e442013-07-12 13:46:57 -07001418
Ian Rogers3d504072014-03-01 09:16:49 -08001419void CompilerDriver::UpdateImageClasses(TimingLogger* timings) {
Vladimir Markoaad75c62016-10-03 08:46:48 +00001420 if (GetCompilerOptions().IsBootImage()) {
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001421 TimingLogger::ScopedTiming t("UpdateImageClasses", timings);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001422
Mathieu Chartier4f55e222015-09-04 13:26:21 -07001423 Runtime* runtime = Runtime::Current();
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001424
1425 // Suspend all threads.
Mathieu Chartier4f55e222015-09-04 13:26:21 -07001426 ScopedSuspendAll ssa(__FUNCTION__);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001427
Mathieu Chartier31e88222016-10-14 18:43:19 -07001428 VariableSizedHandleScope hs(Thread::Current());
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001429 std::string error_msg;
Mathieu Chartier31e88222016-10-14 18:43:19 -07001430 std::unique_ptr<ClinitImageUpdate> update(ClinitImageUpdate::Create(hs,
1431 image_classes_.get(),
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001432 Thread::Current(),
Mathieu Chartier31e88222016-10-14 18:43:19 -07001433 runtime->GetClassLinker()));
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001434
1435 // Do the marking.
1436 update->Walk();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001437 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001438}
1439
Vladimir Marko07785bb2015-06-15 18:52:54 +01001440bool CompilerDriver::CanAssumeClassIsLoaded(mirror::Class* klass) {
1441 Runtime* runtime = Runtime::Current();
1442 if (!runtime->IsAotCompiler()) {
Calin Juravleffc87072016-04-20 14:22:09 +01001443 DCHECK(runtime->UseJitCompilation());
Vladimir Marko07785bb2015-06-15 18:52:54 +01001444 // Having the klass reference here implies that the klass is already loaded.
1445 return true;
1446 }
Vladimir Markoaad75c62016-10-03 08:46:48 +00001447 if (!GetCompilerOptions().IsBootImage()) {
Vladimir Marko07785bb2015-06-15 18:52:54 +01001448 // Assume loaded only if klass is in the boot image. App classes cannot be assumed
1449 // loaded because we don't even know what class loader will be used to load them.
1450 bool class_in_image = runtime->GetHeap()->FindSpaceFromObject(klass, false)->IsImageSpace();
1451 return class_in_image;
1452 }
1453 std::string temp;
1454 const char* descriptor = klass->GetDescriptor(&temp);
1455 return IsImageClass(descriptor);
1456}
1457
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001458bool CompilerDriver::CanAccessTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class,
1459 ObjPtr<mirror::Class> resolved_class) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001460 if (resolved_class == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001461 stats_->TypeNeedsAccessCheck();
1462 return false; // Unknown class needs access checks.
1463 }
David Brazdil38f64d32016-01-18 17:13:41 +00001464 bool is_accessible = resolved_class->IsPublic(); // Public classes are always accessible.
1465 if (!is_accessible) {
David Brazdil38f64d32016-01-18 17:13:41 +00001466 if (referrer_class == nullptr) {
1467 stats_->TypeNeedsAccessCheck();
1468 return false; // Incomplete referrer knowledge needs access check.
1469 }
1470 // Perform access check, will return true if access is ok or false if we're going to have to
1471 // check this at runtime (for example for class loaders).
1472 is_accessible = referrer_class->CanAccess(resolved_class);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001473 }
David Brazdil38f64d32016-01-18 17:13:41 +00001474 if (is_accessible) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001475 stats_->TypeDoesntNeedAccessCheck();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001476 } else {
1477 stats_->TypeNeedsAccessCheck();
1478 }
David Brazdil38f64d32016-01-18 17:13:41 +00001479 return is_accessible;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001480}
1481
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001482bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class,
1483 ObjPtr<mirror::Class> resolved_class,
Mingyao Yangfb8464a2015-11-02 10:56:59 -08001484 bool* finalizable) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001485 if (resolved_class == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001486 stats_->TypeNeedsAccessCheck();
Mingyao Yangfb8464a2015-11-02 10:56:59 -08001487 // Be conservative.
1488 *finalizable = true;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001489 return false; // Unknown class needs access checks.
1490 }
Mingyao Yangfb8464a2015-11-02 10:56:59 -08001491 *finalizable = resolved_class->IsFinalizable();
David Brazdil38f64d32016-01-18 17:13:41 +00001492 bool is_accessible = resolved_class->IsPublic(); // Public classes are always accessible.
1493 if (!is_accessible) {
David Brazdil38f64d32016-01-18 17:13:41 +00001494 if (referrer_class == nullptr) {
1495 stats_->TypeNeedsAccessCheck();
1496 return false; // Incomplete referrer knowledge needs access check.
1497 }
1498 // Perform access and instantiable checks, will return true if access is ok or false if we're
1499 // going to have to check this at runtime (for example for class loaders).
1500 is_accessible = referrer_class->CanAccess(resolved_class);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001501 }
David Brazdil38f64d32016-01-18 17:13:41 +00001502 bool result = is_accessible && resolved_class->IsInstantiable();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001503 if (result) {
1504 stats_->TypeDoesntNeedAccessCheck();
1505 } else {
1506 stats_->TypeNeedsAccessCheck();
1507 }
1508 return result;
1509}
1510
Vladimir Markobe0e5462014-02-26 11:24:15 +00001511void CompilerDriver::ProcessedInstanceField(bool resolved) {
1512 if (!resolved) {
1513 stats_->UnresolvedInstanceField();
1514 } else {
1515 stats_->ResolvedInstanceField();
1516 }
1517}
1518
1519void CompilerDriver::ProcessedStaticField(bool resolved, bool local) {
1520 if (!resolved) {
1521 stats_->UnresolvedStaticField();
1522 } else if (local) {
1523 stats_->ResolvedLocalStaticField();
1524 } else {
1525 stats_->ResolvedStaticField();
1526 }
1527}
1528
Mathieu Chartierc7853442015-03-27 14:35:38 -07001529ArtField* CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx,
Vladimir Markoe11dd502017-12-08 14:09:45 +00001530 const DexCompilationUnit* mUnit,
1531 bool is_put,
Mathieu Chartierc7853442015-03-27 14:35:38 -07001532 const ScopedObjectAccess& soa) {
Vladimir Markobe0e5462014-02-26 11:24:15 +00001533 // Try to resolve the field and compiling method's class.
Mathieu Chartierc7853442015-03-27 14:35:38 -07001534 ArtField* resolved_field;
Vladimir Marko28e012a2017-12-07 11:22:59 +00001535 ObjPtr<mirror::Class> referrer_class;
Mathieu Chartier736b5602015-09-02 14:54:11 -07001536 Handle<mirror::DexCache> dex_cache(mUnit->GetDexCache());
Vladimir Markobe0e5462014-02-26 11:24:15 +00001537 {
Vladimir Markoe11dd502017-12-08 14:09:45 +00001538 Handle<mirror::ClassLoader> class_loader = mUnit->GetClassLoader();
1539 resolved_field = ResolveField(soa, dex_cache, class_loader, field_idx, /* is_static */ false);
Mathieu Chartierc7853442015-03-27 14:35:38 -07001540 referrer_class = resolved_field != nullptr
Vladimir Markoe11dd502017-12-08 14:09:45 +00001541 ? ResolveCompilingMethodsClass(soa, dex_cache, class_loader, mUnit) : nullptr;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001542 }
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001543 bool can_link = false;
Vladimir Markobe0e5462014-02-26 11:24:15 +00001544 if (resolved_field != nullptr && referrer_class != nullptr) {
Vladimir Markobe0e5462014-02-26 11:24:15 +00001545 std::pair<bool, bool> fast_path = IsFastInstanceField(
Mathieu Chartier736b5602015-09-02 14:54:11 -07001546 dex_cache.Get(), referrer_class, resolved_field, field_idx);
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001547 can_link = is_put ? fast_path.second : fast_path.first;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001548 }
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001549 ProcessedInstanceField(can_link);
1550 return can_link ? resolved_field : nullptr;
1551}
1552
1553bool CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit,
1554 bool is_put, MemberOffset* field_offset,
1555 bool* is_volatile) {
1556 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartierc7853442015-03-27 14:35:38 -07001557 ArtField* resolved_field = ComputeInstanceFieldInfo(field_idx, mUnit, is_put, soa);
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001558
Mathieu Chartierc7853442015-03-27 14:35:38 -07001559 if (resolved_field == nullptr) {
Vladimir Markobe0e5462014-02-26 11:24:15 +00001560 // Conservative defaults.
1561 *is_volatile = true;
1562 *field_offset = MemberOffset(static_cast<size_t>(-1));
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001563 return false;
1564 } else {
1565 *is_volatile = resolved_field->IsVolatile();
1566 *field_offset = resolved_field->GetOffset();
1567 return true;
Vladimir Markobe0e5462014-02-26 11:24:15 +00001568 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001569}
1570
Vladimir Marko2730db02014-01-27 11:15:17 +00001571const VerifiedMethod* CompilerDriver::GetVerifiedMethod(const DexFile* dex_file,
1572 uint32_t method_idx) const {
1573 MethodReference ref(dex_file, method_idx);
1574 return verification_results_->GetVerifiedMethod(ref);
1575}
1576
1577bool CompilerDriver::IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001578 if (!compiler_options_->IsVerificationEnabled()) {
1579 // If we didn't verify, every cast has to be treated as non-safe.
1580 return false;
1581 }
Vladimir Marko2730db02014-01-27 11:15:17 +00001582 DCHECK(mUnit->GetVerifiedMethod() != nullptr);
1583 bool result = mUnit->GetVerifiedMethod()->IsSafeCast(dex_pc);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001584 if (result) {
1585 stats_->SafeCast();
1586 } else {
1587 stats_->NotASafeCast();
1588 }
1589 return result;
1590}
1591
Mathieu Chartier90443472015-07-16 20:32:27 -07001592class CompilationVisitor {
1593 public:
1594 virtual ~CompilationVisitor() {}
1595 virtual void Visit(size_t index) = 0;
1596};
1597
Brian Carlstrom7940e442013-07-12 13:46:57 -07001598class ParallelCompilationManager {
1599 public:
Brian Carlstrom7940e442013-07-12 13:46:57 -07001600 ParallelCompilationManager(ClassLinker* class_linker,
1601 jobject class_loader,
1602 CompilerDriver* compiler,
1603 const DexFile* dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07001604 const std::vector<const DexFile*>& dex_files,
Ian Rogers3d504072014-03-01 09:16:49 -08001605 ThreadPool* thread_pool)
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001606 : index_(0),
1607 class_linker_(class_linker),
Brian Carlstrom7940e442013-07-12 13:46:57 -07001608 class_loader_(class_loader),
1609 compiler_(compiler),
1610 dex_file_(dex_file),
Andreas Gampede7b4362014-07-28 18:38:57 -07001611 dex_files_(dex_files),
Ian Rogers3d504072014-03-01 09:16:49 -08001612 thread_pool_(thread_pool) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07001613
1614 ClassLinker* GetClassLinker() const {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001615 CHECK(class_linker_ != nullptr);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001616 return class_linker_;
1617 }
1618
1619 jobject GetClassLoader() const {
1620 return class_loader_;
1621 }
1622
1623 CompilerDriver* GetCompiler() const {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001624 CHECK(compiler_ != nullptr);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001625 return compiler_;
1626 }
1627
1628 const DexFile* GetDexFile() const {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001629 CHECK(dex_file_ != nullptr);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001630 return dex_file_;
1631 }
1632
Andreas Gampede7b4362014-07-28 18:38:57 -07001633 const std::vector<const DexFile*>& GetDexFiles() const {
1634 return dex_files_;
1635 }
1636
Mathieu Chartier90443472015-07-16 20:32:27 -07001637 void ForAll(size_t begin, size_t end, CompilationVisitor* visitor, size_t work_units)
1638 REQUIRES(!*Locks::mutator_lock_) {
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001639 ForAllLambda(begin, end, [visitor](size_t index) { visitor->Visit(index); }, work_units);
1640 }
1641
1642 template <typename Fn>
1643 void ForAllLambda(size_t begin, size_t end, Fn fn, size_t work_units)
1644 REQUIRES(!*Locks::mutator_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001645 Thread* self = Thread::Current();
1646 self->AssertNoPendingException();
1647 CHECK_GT(work_units, 0U);
1648
Orion Hodson88591fe2018-03-06 13:35:43 +00001649 index_.store(begin, std::memory_order_relaxed);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001650 for (size_t i = 0; i < work_units; ++i) {
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001651 thread_pool_->AddTask(self, new ForAllClosureLambda<Fn>(this, end, fn));
Brian Carlstrom7940e442013-07-12 13:46:57 -07001652 }
1653 thread_pool_->StartWorkers(self);
1654
1655 // Ensure we're suspended while we're blocked waiting for the other threads to finish (worker
1656 // thread destructor's called below perform join).
1657 CHECK_NE(self->GetState(), kRunnable);
1658
1659 // Wait for all the worker threads to finish.
1660 thread_pool_->Wait(self, true, false);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001661
1662 // And stop the workers accepting jobs.
1663 thread_pool_->StopWorkers(self);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001664 }
1665
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001666 size_t NextIndex() {
Orion Hodson88591fe2018-03-06 13:35:43 +00001667 return index_.fetch_add(1, std::memory_order_seq_cst);
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001668 }
1669
Brian Carlstrom7940e442013-07-12 13:46:57 -07001670 private:
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001671 template <typename Fn>
1672 class ForAllClosureLambda : public Task {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001673 public:
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001674 ForAllClosureLambda(ParallelCompilationManager* manager, size_t end, Fn fn)
Brian Carlstrom7940e442013-07-12 13:46:57 -07001675 : manager_(manager),
Brian Carlstrom7940e442013-07-12 13:46:57 -07001676 end_(end),
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001677 fn_(fn) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07001678
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001679 void Run(Thread* self) OVERRIDE {
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001680 while (true) {
1681 const size_t index = manager_->NextIndex();
1682 if (UNLIKELY(index >= end_)) {
1683 break;
1684 }
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001685 fn_(index);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001686 self->AssertNoPendingException();
1687 }
1688 }
1689
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001690 void Finalize() OVERRIDE {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001691 delete this;
1692 }
Brian Carlstrom0cd7ec22013-07-17 23:40:20 -07001693
Brian Carlstrom7940e442013-07-12 13:46:57 -07001694 private:
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001695 ParallelCompilationManager* const manager_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001696 const size_t end_;
Andreas Gampe3c060ad2018-01-22 13:07:49 -08001697 Fn fn_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001698 };
1699
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001700 AtomicInteger index_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001701 ClassLinker* const class_linker_;
1702 const jobject class_loader_;
1703 CompilerDriver* const compiler_;
1704 const DexFile* const dex_file_;
Andreas Gampede7b4362014-07-28 18:38:57 -07001705 const std::vector<const DexFile*>& dex_files_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001706 ThreadPool* const thread_pool_;
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001707
1708 DISALLOW_COPY_AND_ASSIGN(ParallelCompilationManager);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001709};
1710
Jeff Hao0e49b422013-11-08 12:16:56 -08001711// A fast version of SkipClass above if the class pointer is available
1712// that avoids the expensive FindInClassPath search.
Vladimir Marko28e012a2017-12-07 11:22:59 +00001713static bool SkipClass(jobject class_loader, const DexFile& dex_file, ObjPtr<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001714 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001715 DCHECK(klass != nullptr);
Jeff Hao0e49b422013-11-08 12:16:56 -08001716 const DexFile& original_dex_file = *klass->GetDexCache()->GetDexFile();
1717 if (&dex_file != &original_dex_file) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001718 if (class_loader == nullptr) {
David Sehr709b0702016-10-13 09:12:37 -07001719 LOG(WARNING) << "Skipping class " << klass->PrettyDescriptor() << " from "
Jeff Hao0e49b422013-11-08 12:16:56 -08001720 << dex_file.GetLocation() << " previously found in "
1721 << original_dex_file.GetLocation();
1722 }
1723 return true;
1724 }
1725 return false;
1726}
1727
Mathieu Chartier70b63482014-06-27 17:19:04 -07001728static void CheckAndClearResolveException(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001729 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier70b63482014-06-27 17:19:04 -07001730 CHECK(self->IsExceptionPending());
Nicolas Geoffray14691c52015-03-05 10:40:17 +00001731 mirror::Throwable* exception = self->GetException();
Ian Rogers1ff3c982014-08-12 02:30:58 -07001732 std::string temp;
1733 const char* descriptor = exception->GetClass()->GetDescriptor(&temp);
1734 const char* expected_exceptions[] = {
1735 "Ljava/lang/IllegalAccessError;",
1736 "Ljava/lang/IncompatibleClassChangeError;",
1737 "Ljava/lang/InstantiationError;",
Brian Carlstrom898fcb52014-08-25 23:07:30 -07001738 "Ljava/lang/LinkageError;",
Ian Rogers1ff3c982014-08-12 02:30:58 -07001739 "Ljava/lang/NoClassDefFoundError;",
1740 "Ljava/lang/NoSuchFieldError;",
1741 "Ljava/lang/NoSuchMethodError;"
1742 };
1743 bool found = false;
1744 for (size_t i = 0; (found == false) && (i < arraysize(expected_exceptions)); ++i) {
1745 if (strcmp(descriptor, expected_exceptions[i]) == 0) {
1746 found = true;
1747 }
1748 }
1749 if (!found) {
Brian Carlstrom898fcb52014-08-25 23:07:30 -07001750 LOG(FATAL) << "Unexpected exception " << exception->Dump();
Mathieu Chartier70b63482014-06-27 17:19:04 -07001751 }
1752 self->ClearException();
1753}
1754
Mathieu Chartierb5d38612016-04-07 10:52:52 -07001755bool CompilerDriver::RequiresConstructorBarrier(const DexFile& dex_file,
1756 uint16_t class_def_idx) const {
1757 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_idx);
1758 const uint8_t* class_data = dex_file.GetClassData(class_def);
1759 if (class_data == nullptr) {
1760 // Empty class such as a marker interface.
1761 return false;
1762 }
1763 ClassDataItemIterator it(dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -07001764 it.SkipStaticFields();
Mathieu Chartierb5d38612016-04-07 10:52:52 -07001765 // We require a constructor barrier if there are final instance fields.
1766 while (it.HasNextInstanceField()) {
1767 if (it.MemberIsFinal()) {
1768 return true;
1769 }
1770 it.Next();
1771 }
1772 return false;
1773}
1774
Mathieu Chartier90443472015-07-16 20:32:27 -07001775class ResolveClassFieldsAndMethodsVisitor : public CompilationVisitor {
1776 public:
1777 explicit ResolveClassFieldsAndMethodsVisitor(const ParallelCompilationManager* manager)
1778 : manager_(manager) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07001779
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001780 void Visit(size_t class_def_index) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
Andreas Gampe9b827ab2017-12-07 19:32:48 -08001781 ScopedTrace trace(__FUNCTION__);
Mathieu Chartier90443472015-07-16 20:32:27 -07001782 Thread* const self = Thread::Current();
1783 jobject jclass_loader = manager_->GetClassLoader();
1784 const DexFile& dex_file = *manager_->GetDexFile();
1785 ClassLinker* class_linker = manager_->GetClassLinker();
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001786
Mathieu Chartier90443472015-07-16 20:32:27 -07001787 // If an instance field is final then we need to have a barrier on the return, static final
1788 // fields are assigned within the lock held for class initialization. Conservatively assume
1789 // constructor barriers are always required.
1790 bool requires_constructor_barrier = true;
1791
1792 // Method and Field are the worst. We can't resolve without either
1793 // context from the code use (to disambiguate virtual vs direct
1794 // method and instance vs static field) or from class
1795 // definitions. While the compiler will resolve what it can as it
1796 // needs it, here we try to resolve fields and methods used in class
1797 // definitions, since many of them many never be referenced by
1798 // generated code.
1799 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
1800 ScopedObjectAccess soa(self);
1801 StackHandleScope<2> hs(soa.Self());
1802 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07001803 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07001804 Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
Vladimir Markocd556b02017-02-03 11:47:34 +00001805 soa.Self(), dex_file)));
Mathieu Chartier90443472015-07-16 20:32:27 -07001806 // Resolve the class.
Vladimir Marko28e012a2017-12-07 11:22:59 +00001807 ObjPtr<mirror::Class> klass =
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001808 class_linker->ResolveType(class_def.class_idx_, dex_cache, class_loader);
Mathieu Chartier90443472015-07-16 20:32:27 -07001809 bool resolve_fields_and_methods;
1810 if (klass == nullptr) {
1811 // Class couldn't be resolved, for example, super-class is in a different dex file. Don't
1812 // attempt to resolve methods and fields when there is no declaring class.
1813 CheckAndClearResolveException(soa.Self());
1814 resolve_fields_and_methods = false;
1815 } else {
1816 // We successfully resolved a class, should we skip it?
1817 if (SkipClass(jclass_loader, dex_file, klass)) {
1818 return;
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001819 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001820 // We want to resolve the methods and fields eagerly.
1821 resolve_fields_and_methods = true;
Ian Rogers68b56852014-08-29 20:19:11 -07001822 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001823 // Note the class_data pointer advances through the headers,
1824 // static fields, instance fields, direct methods, and virtual
1825 // methods.
1826 const uint8_t* class_data = dex_file.GetClassData(class_def);
1827 if (class_data == nullptr) {
1828 // Empty class such as a marker interface.
1829 requires_constructor_barrier = false;
1830 } else {
1831 ClassDataItemIterator it(dex_file, class_data);
1832 while (it.HasNextStaticField()) {
1833 if (resolve_fields_and_methods) {
Vladimir Markoe11dd502017-12-08 14:09:45 +00001834 ArtField* field = class_linker->ResolveField(
1835 it.GetMemberIndex(), dex_cache, class_loader, /* is_static */ true);
Mathieu Chartier90443472015-07-16 20:32:27 -07001836 if (field == nullptr) {
1837 CheckAndClearResolveException(soa.Self());
1838 }
Ian Rogers68b56852014-08-29 20:19:11 -07001839 }
1840 it.Next();
1841 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001842 // We require a constructor barrier if there are final instance fields.
1843 requires_constructor_barrier = false;
1844 while (it.HasNextInstanceField()) {
1845 if (it.MemberIsFinal()) {
1846 requires_constructor_barrier = true;
1847 }
1848 if (resolve_fields_and_methods) {
Vladimir Markoe11dd502017-12-08 14:09:45 +00001849 ArtField* field = class_linker->ResolveField(
1850 it.GetMemberIndex(), dex_cache, class_loader, /* is_static */ false);
Mathieu Chartier90443472015-07-16 20:32:27 -07001851 if (field == nullptr) {
1852 CheckAndClearResolveException(soa.Self());
1853 }
Ian Rogers68b56852014-08-29 20:19:11 -07001854 }
1855 it.Next();
1856 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001857 if (resolve_fields_and_methods) {
Mathieu Chartierb7c273c2017-11-10 18:07:56 -08001858 while (it.HasNextMethod()) {
Vladimir Markoba118822017-06-12 15:41:56 +01001859 ArtMethod* method = class_linker->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>(
Vladimir Marko89011192017-12-11 13:45:05 +00001860 it.GetMemberIndex(),
1861 dex_cache,
1862 class_loader,
1863 /* referrer */ nullptr,
Mathieu Chartier90443472015-07-16 20:32:27 -07001864 it.GetMethodInvokeType(class_def));
1865 if (method == nullptr) {
1866 CheckAndClearResolveException(soa.Self());
1867 }
1868 it.Next();
1869 }
1870 DCHECK(!it.HasNext());
1871 }
1872 }
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07001873 manager_->GetCompiler()->SetRequiresConstructorBarrier(self,
1874 &dex_file,
1875 class_def_index,
1876 requires_constructor_barrier);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001877 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001878
Mathieu Chartier90443472015-07-16 20:32:27 -07001879 private:
1880 const ParallelCompilationManager* const manager_;
1881};
1882
1883class ResolveTypeVisitor : public CompilationVisitor {
1884 public:
1885 explicit ResolveTypeVisitor(const ParallelCompilationManager* manager) : manager_(manager) {
1886 }
Andreas Gampea5b09a62016-11-17 15:21:22 -08001887 void Visit(size_t type_idx) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001888 // Class derived values are more complicated, they require the linker and loader.
Mathieu Chartier90443472015-07-16 20:32:27 -07001889 ScopedObjectAccess soa(Thread::Current());
1890 ClassLinker* class_linker = manager_->GetClassLinker();
1891 const DexFile& dex_file = *manager_->GetDexFile();
1892 StackHandleScope<2> hs(soa.Self());
Mathieu Chartier90443472015-07-16 20:32:27 -07001893 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07001894 hs.NewHandle(soa.Decode<mirror::ClassLoader>(manager_->GetClassLoader())));
Mathieu Chartierd57d4542015-10-14 10:55:30 -07001895 Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->RegisterDexFile(
1896 dex_file,
Mathieu Chartierf284d442016-06-02 11:48:30 -07001897 class_loader.Get())));
Andreas Gampefa4333d2017-02-14 11:10:34 -08001898 ObjPtr<mirror::Class> klass = (dex_cache != nullptr)
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001899 ? class_linker->ResolveType(dex::TypeIndex(type_idx), dex_cache, class_loader)
Vladimir Markocd556b02017-02-03 11:47:34 +00001900 : nullptr;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001901
Mathieu Chartier90443472015-07-16 20:32:27 -07001902 if (klass == nullptr) {
1903 soa.Self()->AssertPendingException();
1904 mirror::Throwable* exception = soa.Self()->GetException();
1905 VLOG(compiler) << "Exception during type resolution: " << exception->Dump();
1906 if (exception->GetClass()->DescriptorEquals("Ljava/lang/OutOfMemoryError;")) {
1907 // There's little point continuing compilation if the heap is exhausted.
1908 LOG(FATAL) << "Out of memory during type resolution for compilation";
1909 }
1910 soa.Self()->ClearException();
Ian Rogersa436fde2013-08-27 23:34:06 -07001911 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001912 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001913
1914 private:
1915 const ParallelCompilationManager* const manager_;
1916};
Brian Carlstrom7940e442013-07-12 13:46:57 -07001917
Andreas Gampeace0dc12016-01-20 13:33:13 -08001918void CompilerDriver::ResolveDexFile(jobject class_loader,
1919 const DexFile& dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07001920 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08001921 ThreadPool* thread_pool,
1922 size_t thread_count,
1923 TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001924 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1925
1926 // TODO: we could resolve strings here, although the string table is largely filled with class
1927 // and method names.
1928
Andreas Gampede7b4362014-07-28 18:38:57 -07001929 ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
1930 thread_pool);
Vladimir Markoaad75c62016-10-03 08:46:48 +00001931 if (GetCompilerOptions().IsBootImage()) {
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001932 // For images we resolve all types, such as array, whereas for applications just those with
1933 // classdefs are resolved by ResolveClassFieldsAndMethods.
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001934 TimingLogger::ScopedTiming t("Resolve Types", timings);
Mathieu Chartier90443472015-07-16 20:32:27 -07001935 ResolveTypeVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001936 context.ForAll(0, dex_file.NumTypeIds(), &visitor, thread_count);
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001937 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001938
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001939 TimingLogger::ScopedTiming t("Resolve MethodsAndFields", timings);
Mathieu Chartier90443472015-07-16 20:32:27 -07001940 ResolveClassFieldsAndMethodsVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001941 context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001942}
1943
Andreas Gampeace0dc12016-01-20 13:33:13 -08001944void CompilerDriver::SetVerified(jobject class_loader,
1945 const std::vector<const DexFile*>& dex_files,
1946 TimingLogger* timings) {
1947 // This can be run in parallel.
Mathieu Chartier90443472015-07-16 20:32:27 -07001948 for (const DexFile* dex_file : dex_files) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001949 CHECK(dex_file != nullptr);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001950 SetVerifiedDexFile(class_loader,
1951 *dex_file,
1952 dex_files,
1953 parallel_thread_pool_.get(),
1954 parallel_thread_count_,
1955 timings);
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001956 }
1957}
1958
Nicolas Geoffray51c17fa2016-11-25 15:56:12 +00001959static void PopulateVerifiedMethods(const DexFile& dex_file,
1960 uint32_t class_def_index,
1961 VerificationResults* verification_results) {
1962 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
1963 const uint8_t* class_data = dex_file.GetClassData(class_def);
1964 if (class_data == nullptr) {
1965 return;
1966 }
1967 ClassDataItemIterator it(dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -07001968 it.SkipAllFields();
Nicolas Geoffray51c17fa2016-11-25 15:56:12 +00001969
Mathieu Chartierb7c273c2017-11-10 18:07:56 -08001970 while (it.HasNextMethod()) {
Nicolas Geoffray51c17fa2016-11-25 15:56:12 +00001971 verification_results->CreateVerifiedMethodFor(MethodReference(&dex_file, it.GetMemberIndex()));
1972 it.Next();
1973 }
1974 DCHECK(!it.HasNext());
1975}
1976
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001977static void LoadAndUpdateStatus(const DexFile& dex_file,
1978 const DexFile::ClassDef& class_def,
Vladimir Marko2c64a832018-01-04 11:31:56 +00001979 ClassStatus status,
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001980 Handle<mirror::ClassLoader> class_loader,
1981 Thread* self)
1982 REQUIRES_SHARED(Locks::mutator_lock_) {
1983 StackHandleScope<1> hs(self);
1984 const char* descriptor = dex_file.GetClassDescriptor(class_def);
1985 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1986 Handle<mirror::Class> cls(hs.NewHandle<mirror::Class>(
1987 class_linker->FindClass(self, descriptor, class_loader)));
Andreas Gampefa4333d2017-02-14 11:10:34 -08001988 if (cls != nullptr) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001989 // Check that the class is resolved with the current dex file. We might get
1990 // a boot image class, or a class in a different dex file for multidex, and
1991 // we should not update the status in that case.
1992 if (&cls->GetDexFile() == &dex_file) {
1993 ObjectLock<mirror::Class> lock(self, cls);
1994 mirror::Class::SetStatus(cls, status, self);
1995 }
1996 } else {
1997 DCHECK(self->IsExceptionPending());
1998 self->ClearException();
1999 }
2000}
2001
Nicolas Geoffray74981052017-01-16 17:54:09 +00002002bool CompilerDriver::FastVerify(jobject jclass_loader,
2003 const std::vector<const DexFile*>& dex_files,
2004 TimingLogger* timings) {
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +00002005 verifier::VerifierDeps* verifier_deps =
2006 Runtime::Current()->GetCompilerCallbacks()->GetVerifierDeps();
Mathieu Chartier72041a02017-07-14 18:23:25 -07002007 // If there exist VerifierDeps that aren't the ones we just created to output, use them to verify.
2008 if (verifier_deps == nullptr || verifier_deps->OutputOnly()) {
Nicolas Geoffray74981052017-01-16 17:54:09 +00002009 return false;
2010 }
2011 TimingLogger::ScopedTiming t("Fast Verify", timings);
2012 ScopedObjectAccess soa(Thread::Current());
2013 StackHandleScope<2> hs(soa.Self());
2014 Handle<mirror::ClassLoader> class_loader(
2015 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Nicolas Geoffray74981052017-01-16 17:54:09 +00002016 if (!verifier_deps->ValidateDependencies(class_loader, soa.Self())) {
2017 return false;
2018 }
2019
Nicolas Geoffray49cda062017-04-21 13:08:25 +01002020 bool compiler_only_verifies = !GetCompilerOptions().IsAnyCompilationEnabled();
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00002021
Nicolas Geoffray74981052017-01-16 17:54:09 +00002022 // We successfully validated the dependencies, now update class status
2023 // of verified classes. Note that the dependencies also record which classes
2024 // could not be fully verified; we could try again, but that would hurt verification
2025 // time. So instead we assume these classes still need to be verified at
2026 // runtime.
2027 for (const DexFile* dex_file : dex_files) {
Mathieu Chartierbf755fe2017-08-01 13:42:56 -07002028 // Fetch the list of unverified classes.
2029 const std::set<dex::TypeIndex>& unverified_classes =
Nicolas Geoffray74981052017-01-16 17:54:09 +00002030 verifier_deps->GetUnverifiedClasses(*dex_file);
Nicolas Geoffray74981052017-01-16 17:54:09 +00002031 for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
2032 const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
Mathieu Chartierbf755fe2017-08-01 13:42:56 -07002033 if (unverified_classes.find(class_def.class_idx_) == unverified_classes.end()) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00002034 if (compiler_only_verifies) {
Nicolas Geoffray74981052017-01-16 17:54:09 +00002035 // Just update the compiled_classes_ map. The compiler doesn't need to resolve
2036 // the type.
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002037 ClassReference ref(dex_file, i);
Vladimir Marko2c64a832018-01-04 11:31:56 +00002038 ClassStatus existing = ClassStatus::kNotReady;
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002039 DCHECK(compiled_classes_.Get(ref, &existing)) << ref.dex_file->GetLocation();
2040 ClassStateTable::InsertResult result =
Vladimir Marko2c64a832018-01-04 11:31:56 +00002041 compiled_classes_.Insert(ref, existing, ClassStatus::kVerified);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002042 CHECK_EQ(result, ClassStateTable::kInsertResultSuccess);
Nicolas Geoffray74981052017-01-16 17:54:09 +00002043 } else {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00002044 // Update the class status, so later compilation stages know they don't need to verify
Nicolas Geoffray74981052017-01-16 17:54:09 +00002045 // the class.
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00002046 LoadAndUpdateStatus(
Vladimir Marko2c64a832018-01-04 11:31:56 +00002047 *dex_file, class_def, ClassStatus::kVerified, class_loader, soa.Self());
Nicolas Geoffray74981052017-01-16 17:54:09 +00002048 // Create `VerifiedMethod`s for each methods, the compiler expects one for
2049 // quickening or compiling.
2050 // Note that this means:
2051 // - We're only going to compile methods that did verify.
2052 // - Quickening will not do checkcast ellision.
2053 // TODO(ngeoffray): Reconsider this once we refactor compiler filters.
2054 PopulateVerifiedMethods(*dex_file, i, verification_results_);
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00002055 }
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00002056 } else if (!compiler_only_verifies) {
2057 // Make sure later compilation stages know they should not try to verify
2058 // this class again.
2059 LoadAndUpdateStatus(*dex_file,
2060 class_def,
Vladimir Marko2c64a832018-01-04 11:31:56 +00002061 ClassStatus::kRetryVerificationAtRuntime,
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00002062 class_loader,
2063 soa.Self());
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00002064 }
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00002065 }
2066 }
Nicolas Geoffray74981052017-01-16 17:54:09 +00002067 return true;
2068}
2069
2070void CompilerDriver::Verify(jobject jclass_loader,
2071 const std::vector<const DexFile*>& dex_files,
2072 TimingLogger* timings) {
2073 if (FastVerify(jclass_loader, dex_files, timings)) {
2074 return;
2075 }
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00002076
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +00002077 // If there is no existing `verifier_deps` (because of non-existing vdex), or
2078 // the existing `verifier_deps` is not valid anymore, create a new one for
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00002079 // non boot image compilation. The verifier will need it to record the new dependencies.
2080 // Then dex2oat can update the vdex file with these new dependencies.
2081 if (!GetCompilerOptions().IsBootImage()) {
Mathieu Chartier72041a02017-07-14 18:23:25 -07002082 // Dex2oat creates the verifier deps.
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002083 // Create the main VerifierDeps, and set it to this thread.
Mathieu Chartier72041a02017-07-14 18:23:25 -07002084 verifier::VerifierDeps* verifier_deps =
2085 Runtime::Current()->GetCompilerCallbacks()->GetVerifierDeps();
2086 CHECK(verifier_deps != nullptr);
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +00002087 Thread::Current()->SetVerifierDeps(verifier_deps);
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002088 // Create per-thread VerifierDeps to avoid contention on the main one.
2089 // We will merge them after verification.
2090 for (ThreadPoolWorker* worker : parallel_thread_pool_->GetWorkers()) {
Mathieu Chartier72041a02017-07-14 18:23:25 -07002091 worker->GetThread()->SetVerifierDeps(new verifier::VerifierDeps(dex_files_for_oat_file_));
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002092 }
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00002093 }
Nicolas Geoffray74981052017-01-16 17:54:09 +00002094
Nicolas Geoffray46847392017-04-28 14:56:39 +01002095 // Verification updates VerifierDeps and needs to run single-threaded to be deterministic.
2096 bool force_determinism = GetCompilerOptions().IsForceDeterminism();
2097 ThreadPool* verify_thread_pool =
2098 force_determinism ? single_thread_pool_.get() : parallel_thread_pool_.get();
2099 size_t verify_thread_count = force_determinism ? 1U : parallel_thread_count_;
Mathieu Chartier90443472015-07-16 20:32:27 -07002100 for (const DexFile* dex_file : dex_files) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002101 CHECK(dex_file != nullptr);
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00002102 VerifyDexFile(jclass_loader,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002103 *dex_file,
2104 dex_files,
Nicolas Geoffray46847392017-04-28 14:56:39 +01002105 verify_thread_pool,
2106 verify_thread_count,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002107 timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002108 }
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002109
2110 if (!GetCompilerOptions().IsBootImage()) {
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002111 // Merge all VerifierDeps into the main one.
Nicolas Geoffray74981052017-01-16 17:54:09 +00002112 verifier::VerifierDeps* verifier_deps = Thread::Current()->GetVerifierDeps();
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002113 for (ThreadPoolWorker* worker : parallel_thread_pool_->GetWorkers()) {
2114 verifier::VerifierDeps* thread_deps = worker->GetThread()->GetVerifierDeps();
2115 worker->GetThread()->SetVerifierDeps(nullptr);
Mathieu Chartier72041a02017-07-14 18:23:25 -07002116 verifier_deps->MergeWith(*thread_deps, dex_files_for_oat_file_);
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002117 delete thread_deps;
2118 }
2119 Thread::Current()->SetVerifierDeps(nullptr);
2120 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002121}
2122
Mathieu Chartier90443472015-07-16 20:32:27 -07002123class VerifyClassVisitor : public CompilationVisitor {
2124 public:
Andreas Gampe5fd66d02016-09-12 20:22:19 -07002125 VerifyClassVisitor(const ParallelCompilationManager* manager, verifier::HardFailLogMode log_level)
Andreas Gampe7fe30232016-03-25 16:58:00 -07002126 : manager_(manager), log_level_(log_level) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07002127
Mathieu Chartier90443472015-07-16 20:32:27 -07002128 virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
Andreas Gampe9b827ab2017-12-07 19:32:48 -08002129 ScopedTrace trace(__FUNCTION__);
Mathieu Chartier90443472015-07-16 20:32:27 -07002130 ScopedObjectAccess soa(Thread::Current());
2131 const DexFile& dex_file = *manager_->GetDexFile();
2132 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2133 const char* descriptor = dex_file.GetClassDescriptor(class_def);
2134 ClassLinker* class_linker = manager_->GetClassLinker();
2135 jobject jclass_loader = manager_->GetClassLoader();
2136 StackHandleScope<3> hs(soa.Self());
2137 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002138 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002139 Handle<mirror::Class> klass(
2140 hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002141 verifier::FailureKind failure_kind;
Andreas Gampefa4333d2017-02-14 11:10:34 -08002142 if (klass == nullptr) {
Ian Rogerse6bb3b22013-08-19 21:51:45 -07002143 CHECK(soa.Self()->IsExceptionPending());
2144 soa.Self()->ClearException();
Mathieu Chartier90443472015-07-16 20:32:27 -07002145
2146 /*
2147 * At compile time, we can still structurally verify the class even if FindClass fails.
2148 * This is to ensure the class is structurally sound for compilation. An unsound class
2149 * will be rejected by the verifier and later skipped during compilation in the compiler.
2150 */
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07002151 Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
Vladimir Markocd556b02017-02-03 11:47:34 +00002152 soa.Self(), dex_file)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002153 std::string error_msg;
Nicolas Geoffray08025182016-10-25 17:20:18 +01002154 failure_kind =
2155 verifier::MethodVerifier::VerifyClass(soa.Self(),
Andreas Gampeec6e6c12015-11-05 20:39:56 -08002156 &dex_file,
2157 dex_cache,
2158 class_loader,
David Brazdil15fc7292016-09-02 14:13:18 +01002159 class_def,
Andreas Gampe53e32d12015-12-09 21:03:23 -08002160 Runtime::Current()->GetCompilerCallbacks(),
Andreas Gampeec6e6c12015-11-05 20:39:56 -08002161 true /* allow soft failures */,
Andreas Gampe7fe30232016-03-25 16:58:00 -07002162 log_level_,
Nicolas Geoffray08025182016-10-25 17:20:18 +01002163 &error_msg);
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002164 if (failure_kind == verifier::FailureKind::kHardFailure) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002165 LOG(ERROR) << "Verification failed on class " << PrettyDescriptor(descriptor)
2166 << " because: " << error_msg;
2167 manager_->GetCompiler()->SetHadHardVerifierFailure();
Andreas Gampef39208f2017-10-19 15:06:59 -07002168 } else if (failure_kind == verifier::FailureKind::kSoftFailure) {
2169 manager_->GetCompiler()->AddSoftVerifierFailure();
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002170 } else {
2171 // Force a soft failure for the VerifierDeps. This is a sanity measure, as
2172 // the vdex file already records that the class hasn't been resolved. It avoids
2173 // trying to do future verification optimizations when processing the vdex file.
Andreas Gampef39208f2017-10-19 15:06:59 -07002174 DCHECK(failure_kind == verifier::FailureKind::kNoFailure) << failure_kind;
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002175 failure_kind = verifier::FailureKind::kSoftFailure;
Mathieu Chartier90443472015-07-16 20:32:27 -07002176 }
2177 } else if (!SkipClass(jclass_loader, dex_file, klass.Get())) {
David Sehr709b0702016-10-13 09:12:37 -07002178 CHECK(klass->IsResolved()) << klass->PrettyClass();
Nicolas Geoffray08025182016-10-25 17:20:18 +01002179 failure_kind = class_linker->VerifyClass(soa.Self(), klass, log_level_);
Mathieu Chartier90443472015-07-16 20:32:27 -07002180
2181 if (klass->IsErroneous()) {
2182 // ClassLinker::VerifyClass throws, which isn't useful in the compiler.
2183 CHECK(soa.Self()->IsExceptionPending());
2184 soa.Self()->ClearException();
2185 manager_->GetCompiler()->SetHadHardVerifierFailure();
Andreas Gampef39208f2017-10-19 15:06:59 -07002186 } else if (failure_kind == verifier::FailureKind::kSoftFailure) {
2187 manager_->GetCompiler()->AddSoftVerifierFailure();
Mathieu Chartier90443472015-07-16 20:32:27 -07002188 }
2189
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002190 CHECK(klass->ShouldVerifyAtRuntime() || klass->IsVerified() || klass->IsErroneous())
David Sehr709b0702016-10-13 09:12:37 -07002191 << klass->PrettyDescriptor() << ": state=" << klass->GetStatus();
Mathieu Chartier90443472015-07-16 20:32:27 -07002192
Nicolas Geoffrayc7da1d62017-04-19 09:36:24 +01002193 // Class has a meaningful status for the compiler now, record it.
2194 ClassReference ref(manager_->GetDexFile(), class_def_index);
2195 manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
2196
Andreas Gamped278cb42017-11-22 14:13:00 -08002197 // It is *very* problematic if there are resolution errors in the boot classpath.
2198 //
2199 // It is also bad if classes fail verification. For example, we rely on things working
2200 // OK without verification when the decryption dialog is brought up. It is thus highly
2201 // recommended to compile the boot classpath with
2202 // --abort-on-hard-verifier-error --abort-on-soft-verifier-error
2203 // which is the default build system configuration.
Narayan Kamathe3eae5e2016-10-27 11:47:30 +01002204 if (kIsDebugBuild) {
Orion Hodsonc5e0d3f2017-08-22 19:00:04 +01002205 if (manager_->GetCompiler()->GetCompilerOptions().IsBootImage()) {
Andreas Gamped278cb42017-11-22 14:13:00 -08002206 if (!klass->IsResolved() || klass->IsErroneous()) {
Andreas Gampe12fadcd2017-08-03 05:06:28 -07002207 LOG(FATAL) << "Boot classpath class " << klass->PrettyClass()
Andreas Gamped278cb42017-11-22 14:13:00 -08002208 << " failed to resolve/is erroneous: state= " << klass->GetStatus();
2209 UNREACHABLE();
Andreas Gampe12fadcd2017-08-03 05:06:28 -07002210 }
Narayan Kamathe3eae5e2016-10-27 11:47:30 +01002211 }
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002212 if (klass->IsVerified()) {
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002213 DCHECK_EQ(failure_kind, verifier::FailureKind::kNoFailure);
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002214 } else if (klass->ShouldVerifyAtRuntime()) {
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002215 DCHECK_EQ(failure_kind, verifier::FailureKind::kSoftFailure);
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002216 } else {
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002217 DCHECK_EQ(failure_kind, verifier::FailureKind::kHardFailure);
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002218 }
Narayan Kamathe3eae5e2016-10-27 11:47:30 +01002219 }
Nicolas Geoffray08025182016-10-25 17:20:18 +01002220 } else {
2221 // Make the skip a soft failure, essentially being considered as verify at runtime.
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002222 failure_kind = verifier::FailureKind::kSoftFailure;
Ian Rogerse6bb3b22013-08-19 21:51:45 -07002223 }
Nicolas Geoffray08025182016-10-25 17:20:18 +01002224 verifier::VerifierDeps::MaybeRecordVerificationStatus(
2225 dex_file, class_def.class_idx_, failure_kind);
Mathieu Chartier90443472015-07-16 20:32:27 -07002226 soa.Self()->AssertNoPendingException();
Brian Carlstrom7940e442013-07-12 13:46:57 -07002227 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002228
2229 private:
2230 const ParallelCompilationManager* const manager_;
Andreas Gampe5fd66d02016-09-12 20:22:19 -07002231 const verifier::HardFailLogMode log_level_;
Mathieu Chartier90443472015-07-16 20:32:27 -07002232};
Brian Carlstrom7940e442013-07-12 13:46:57 -07002233
Andreas Gampeace0dc12016-01-20 13:33:13 -08002234void CompilerDriver::VerifyDexFile(jobject class_loader,
2235 const DexFile& dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07002236 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002237 ThreadPool* thread_pool,
2238 size_t thread_count,
2239 TimingLogger* timings) {
Mathieu Chartierf5997b42014-06-20 10:37:54 -07002240 TimingLogger::ScopedTiming t("Verify Dex File", timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002241 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
Andreas Gampede7b4362014-07-28 18:38:57 -07002242 ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2243 thread_pool);
Andreas Gampef39208f2017-10-19 15:06:59 -07002244 bool abort_on_verifier_failures = GetCompilerOptions().AbortOnHardVerifierFailure()
2245 || GetCompilerOptions().AbortOnSoftVerifierFailure();
2246 verifier::HardFailLogMode log_level = abort_on_verifier_failures
Andreas Gampe5fd66d02016-09-12 20:22:19 -07002247 ? verifier::HardFailLogMode::kLogInternalFatal
2248 : verifier::HardFailLogMode::kLogWarning;
Andreas Gampe7fe30232016-03-25 16:58:00 -07002249 VerifyClassVisitor visitor(&context, log_level);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002250 context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002251}
2252
Mathieu Chartier90443472015-07-16 20:32:27 -07002253class SetVerifiedClassVisitor : public CompilationVisitor {
2254 public:
2255 explicit SetVerifiedClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2256
2257 virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
Andreas Gampe9b827ab2017-12-07 19:32:48 -08002258 ScopedTrace trace(__FUNCTION__);
Mathieu Chartier90443472015-07-16 20:32:27 -07002259 ScopedObjectAccess soa(Thread::Current());
2260 const DexFile& dex_file = *manager_->GetDexFile();
2261 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2262 const char* descriptor = dex_file.GetClassDescriptor(class_def);
2263 ClassLinker* class_linker = manager_->GetClassLinker();
2264 jobject jclass_loader = manager_->GetClassLoader();
2265 StackHandleScope<3> hs(soa.Self());
2266 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002267 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002268 Handle<mirror::Class> klass(
2269 hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2270 // Class might have failed resolution. Then don't set it to verified.
Andreas Gampefa4333d2017-02-14 11:10:34 -08002271 if (klass != nullptr) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002272 // Only do this if the class is resolved. If even resolution fails, quickening will go very,
2273 // very wrong.
Vladimir Marko72ab6842017-01-20 19:32:50 +00002274 if (klass->IsResolved() && !klass->IsErroneousResolved()) {
Vladimir Marko2c64a832018-01-04 11:31:56 +00002275 if (klass->GetStatus() < ClassStatus::kVerified) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002276 ObjectLock<mirror::Class> lock(soa.Self(), klass);
2277 // Set class status to verified.
Vladimir Marko2c64a832018-01-04 11:31:56 +00002278 mirror::Class::SetStatus(klass, ClassStatus::kVerified, soa.Self());
Mathieu Chartier90443472015-07-16 20:32:27 -07002279 // Mark methods as pre-verified. If we don't do this, the interpreter will run with
2280 // access checks.
Igor Murashkindf707e42016-02-02 16:56:50 -08002281 klass->SetSkipAccessChecksFlagOnAllMethods(
Mathieu Chartier90443472015-07-16 20:32:27 -07002282 GetInstructionSetPointerSize(manager_->GetCompiler()->GetInstructionSet()));
Igor Murashkindf707e42016-02-02 16:56:50 -08002283 klass->SetVerificationAttempted();
Mathieu Chartier90443472015-07-16 20:32:27 -07002284 }
2285 // Record the final class status if necessary.
2286 ClassReference ref(manager_->GetDexFile(), class_def_index);
2287 manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002288 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002289 } else {
2290 Thread* self = soa.Self();
2291 DCHECK(self->IsExceptionPending());
2292 self->ClearException();
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002293 }
2294 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002295
2296 private:
2297 const ParallelCompilationManager* const manager_;
2298};
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002299
Andreas Gampeace0dc12016-01-20 13:33:13 -08002300void CompilerDriver::SetVerifiedDexFile(jobject class_loader,
2301 const DexFile& dex_file,
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002302 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002303 ThreadPool* thread_pool,
2304 size_t thread_count,
2305 TimingLogger* timings) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002306 TimingLogger::ScopedTiming t("Verify Dex File", timings);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002307 if (!compiled_classes_.HaveDexFile(&dex_file)) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002308 compiled_classes_.AddDexFile(&dex_file);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002309 }
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002310 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2311 ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2312 thread_pool);
Mathieu Chartier90443472015-07-16 20:32:27 -07002313 SetVerifiedClassVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002314 context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002315}
2316
Mathieu Chartier90443472015-07-16 20:32:27 -07002317class InitializeClassVisitor : public CompilationVisitor {
2318 public:
2319 explicit InitializeClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
Ian Rogersfc0e94b2013-09-23 23:51:32 -07002320
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002321 void Visit(size_t class_def_index) OVERRIDE {
Andreas Gampe9b827ab2017-12-07 19:32:48 -08002322 ScopedTrace trace(__FUNCTION__);
Mathieu Chartier90443472015-07-16 20:32:27 -07002323 jobject jclass_loader = manager_->GetClassLoader();
2324 const DexFile& dex_file = *manager_->GetDexFile();
2325 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2326 const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def.class_idx_);
2327 const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
Jeff Hao0e49b422013-11-08 12:16:56 -08002328
Mathieu Chartier90443472015-07-16 20:32:27 -07002329 ScopedObjectAccess soa(Thread::Current());
2330 StackHandleScope<3> hs(soa.Self());
2331 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002332 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002333 Handle<mirror::Class> klass(
2334 hs.NewHandle(manager_->GetClassLinker()->FindClass(soa.Self(), descriptor, class_loader)));
2335
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002336 if (klass != nullptr && !SkipClass(manager_->GetClassLoader(), dex_file, klass.Get())) {
2337 TryInitializeClass(klass, class_loader);
2338 }
2339 // Clear any class not found or verification exceptions.
2340 soa.Self()->ClearException();
2341 }
2342
2343 // A helper function for initializing klass.
2344 void TryInitializeClass(Handle<mirror::Class> klass, Handle<mirror::ClassLoader>& class_loader)
2345 REQUIRES_SHARED(Locks::mutator_lock_) {
2346 const DexFile& dex_file = klass->GetDexFile();
2347 const DexFile::ClassDef* class_def = klass->GetClassDef();
2348 const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def->class_idx_);
2349 const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
2350 ScopedObjectAccessUnchecked soa(Thread::Current());
2351 StackHandleScope<3> hs(soa.Self());
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002352 const bool is_boot_image = manager_->GetCompiler()->GetCompilerOptions().IsBootImage();
Mathieu Chartier17498e52017-06-13 11:35:04 -07002353 const bool is_app_image = manager_->GetCompiler()->GetCompilerOptions().IsAppImage();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002354
Vladimir Marko2c64a832018-01-04 11:31:56 +00002355 ClassStatus old_status = klass->GetStatus();
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002356 // Don't initialize classes in boot space when compiling app image
2357 if (is_app_image && klass->IsBootStrapClassLoaded()) {
2358 // Also return early and don't store the class status in the recorded class status.
2359 return;
2360 }
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002361 // Only try to initialize classes that were successfully verified.
2362 if (klass->IsVerified()) {
2363 // Attempt to initialize the class but bail if we either need to initialize the super-class
2364 // or static fields.
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002365 manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, false);
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002366 old_status = klass->GetStatus();
2367 if (!klass->IsInitialized()) {
2368 // We don't want non-trivial class initialization occurring on multiple threads due to
2369 // deadlock problems. For example, a parent class is initialized (holding its lock) that
2370 // refers to a sub-class in its static/class initializer causing it to try to acquire the
2371 // sub-class' lock. While on a second thread the sub-class is initialized (holding its lock)
2372 // after first initializing its parents, whose locks are acquired. This leads to a
2373 // parent-to-child and a child-to-parent lock ordering and consequent potential deadlock.
2374 // We need to use an ObjectLock due to potential suspension in the interpreting code. Rather
2375 // than use a special Object for the purpose we use the Class of java.lang.Class.
2376 Handle<mirror::Class> h_klass(hs.NewHandle(klass->GetClass()));
2377 ObjectLock<mirror::Class> lock(soa.Self(), h_klass);
2378 // Attempt to initialize allowing initialization of parent classes but still not static
2379 // fields.
Chang Xinge602b1c2017-06-30 11:55:01 -07002380 // Initialize dependencies first only for app image, to make TryInitialize recursive.
2381 bool is_superclass_initialized = !is_app_image ? true :
2382 InitializeDependencies(klass, class_loader, soa.Self());
2383 if (!is_app_image || (is_app_image && is_superclass_initialized)) {
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002384 manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, true);
Chang Xinge602b1c2017-06-30 11:55:01 -07002385 }
2386 // Otherwise it's in app image but superclasses can't be initialized, no need to proceed.
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002387 old_status = klass->GetStatus();
Chang Xing70f689d2017-06-08 17:16:12 -07002388
2389 bool too_many_encoded_fields = false;
2390 if (!is_boot_image && klass->NumStaticFields() > kMaxEncodedFields) {
2391 too_many_encoded_fields = true;
2392 }
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002393 // If the class was not initialized, we can proceed to see if we can initialize static
Chang Xing70f689d2017-06-08 17:16:12 -07002394 // fields. Limit the max number of encoded fields.
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002395 if (!klass->IsInitialized() &&
Mathieu Chartier17498e52017-06-13 11:35:04 -07002396 (is_app_image || is_boot_image) &&
Chang Xinge602b1c2017-06-30 11:55:01 -07002397 is_superclass_initialized &&
Chang Xing70f689d2017-06-08 17:16:12 -07002398 !too_many_encoded_fields &&
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002399 manager_->GetCompiler()->IsImageClass(descriptor)) {
2400 bool can_init_static_fields = false;
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002401 if (is_boot_image) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002402 // We need to initialize static fields, we only do this for image classes that aren't
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002403 // marked with the $NoPreloadHolder (which implies this should not be initialized
2404 // early).
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002405 can_init_static_fields = !StringPiece(descriptor).ends_with("$NoPreloadHolder;");
2406 } else {
Mathieu Chartier17498e52017-06-13 11:35:04 -07002407 CHECK(is_app_image);
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002408 // The boot image case doesn't need to recursively initialize the dependencies with
2409 // special logic since the class linker already does this.
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002410 can_init_static_fields =
Mathieu Chartier0933cc52018-03-23 14:25:08 -07002411 ClassLinker::kAppImageMayContainStrings &&
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002412 !soa.Self()->IsExceptionPending() &&
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002413 is_superclass_initialized &&
2414 NoClinitInDependency(klass, soa.Self(), &class_loader);
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002415 // TODO The checking for clinit can be removed since it's already
2416 // checked when init superclass. Currently keep it because it contains
2417 // processing of intern strings. Will be removed later when intern strings
2418 // and clinit are both initialized.
2419 }
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002420
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002421 if (can_init_static_fields) {
2422 VLOG(compiler) << "Initializing: " << descriptor;
2423 // TODO multithreading support. We should ensure the current compilation thread has
2424 // exclusive access to the runtime and the transaction. To achieve this, we could use
2425 // a ReaderWriterMutex but we're holding the mutator lock so we fail mutex sanity
2426 // checks in Thread::AssertThreadSuspensionIsAllowable.
2427 Runtime* const runtime = Runtime::Current();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002428 // Run the class initializer in transaction mode.
Chang Xing5a906fc2017-07-26 15:01:16 -07002429 runtime->EnterTransactionMode(is_app_image, klass.Get());
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002430 bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true,
2431 true);
2432 // TODO we detach transaction from runtime to indicate we quit the transactional
2433 // mode which prevents the GC from visiting objects modified during the transaction.
2434 // Ensure GC is not run so don't access freed objects when aborting transaction.
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002435
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002436 {
2437 ScopedAssertNoThreadSuspension ants("Transaction end");
Chang Xing16d1dd82017-07-20 17:56:26 -07002438
2439 if (success) {
2440 runtime->ExitTransactionMode();
2441 DCHECK(!runtime->IsActiveTransaction());
2442 }
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002443
Mathieu Chartier90443472015-07-16 20:32:27 -07002444 if (!success) {
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002445 CHECK(soa.Self()->IsExceptionPending());
2446 mirror::Throwable* exception = soa.Self()->GetException();
2447 VLOG(compiler) << "Initialization of " << descriptor << " aborted because of "
2448 << exception->Dump();
2449 std::ostream* file_log = manager_->GetCompiler()->
2450 GetCompilerOptions().GetInitFailureOutput();
2451 if (file_log != nullptr) {
2452 *file_log << descriptor << "\n";
2453 *file_log << exception->Dump() << "\n";
2454 }
2455 soa.Self()->ClearException();
Chang Xing605fe242017-07-20 15:57:21 -07002456 runtime->RollbackAllTransactions();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002457 CHECK_EQ(old_status, klass->GetStatus()) << "Previous class status not restored";
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002458 } else if (is_boot_image) {
2459 // For boot image, we want to put the updated status in the oat class since we can't
2460 // reject the image anyways.
2461 old_status = klass->GetStatus();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002462 }
2463 }
2464
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002465 if (!success) {
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002466 // On failure, still intern strings of static fields and seen in <clinit>, as these
2467 // will be created in the zygote. This is separated from the transaction code just
2468 // above as we will allocate strings, so must be allowed to suspend.
2469 if (&klass->GetDexFile() == manager_->GetDexFile()) {
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002470 InternStrings(klass, class_loader);
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002471 } else {
2472 DCHECK(!is_boot_image) << "Boot image must have equal dex files";
Andreas Gampedbfe2542014-11-25 22:21:42 -08002473 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002474 }
2475 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002476 }
Jeff Hao0cb17282017-07-12 14:51:49 -07002477 // If the class still isn't initialized, at least try some checks that initialization
2478 // would do so they can be skipped at runtime.
2479 if (!klass->IsInitialized() &&
2480 manager_->GetClassLinker()->ValidateSuperClassDescriptors(klass)) {
Vladimir Marko2c64a832018-01-04 11:31:56 +00002481 old_status = ClassStatus::kSuperclassValidated;
Jeff Hao0cb17282017-07-12 14:51:49 -07002482 } else {
2483 soa.Self()->ClearException();
2484 }
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002485 soa.Self()->AssertNoPendingException();
Brian Carlstrom7940e442013-07-12 13:46:57 -07002486 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002487 }
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002488 // Record the final class status if necessary.
2489 ClassReference ref(&dex_file, klass->GetDexClassDefIndex());
2490 // Back up the status before doing initialization for static encoded fields,
2491 // because the static encoded branch wants to keep the status to uninitialized.
2492 manager_->GetCompiler()->RecordClassStatus(ref, old_status);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002493 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002494
2495 private:
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002496 void InternStrings(Handle<mirror::Class> klass, Handle<mirror::ClassLoader> class_loader)
2497 REQUIRES_SHARED(Locks::mutator_lock_) {
2498 DCHECK(manager_->GetCompiler()->GetCompilerOptions().IsBootImage());
2499 DCHECK(klass->IsVerified());
2500 DCHECK(!klass->IsInitialized());
2501
2502 StackHandleScope<1> hs(Thread::Current());
Vladimir Markoe11dd502017-12-08 14:09:45 +00002503 Handle<mirror::DexCache> dex_cache = hs.NewHandle(klass->GetDexCache());
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002504 const DexFile::ClassDef* class_def = klass->GetClassDef();
2505 ClassLinker* class_linker = manager_->GetClassLinker();
2506
Andreas Gampe7bf90482017-03-02 16:41:35 -08002507 // Check encoded final field values for strings and intern.
Vladimir Markoe11dd502017-12-08 14:09:45 +00002508 annotations::RuntimeEncodedStaticFieldValueIterator value_it(dex_cache,
2509 class_loader,
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002510 manager_->GetClassLinker(),
2511 *class_def);
2512 for ( ; value_it.HasNext(); value_it.Next()) {
2513 if (value_it.GetValueType() == annotations::RuntimeEncodedStaticFieldValueIterator::kString) {
2514 // Resolve the string. This will intern the string.
2515 art::ObjPtr<mirror::String> resolved = class_linker->ResolveString(
Vladimir Markoa64b52d2017-12-08 16:27:49 +00002516 dex::StringIndex(value_it.GetJavaValue().i), dex_cache);
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002517 CHECK(resolved != nullptr);
2518 }
2519 }
Andreas Gampe7bf90482017-03-02 16:41:35 -08002520
2521 // Intern strings seen in <clinit>.
2522 ArtMethod* clinit = klass->FindClassInitializer(class_linker->GetImagePointerSize());
2523 if (clinit != nullptr) {
Mathieu Chartier73f21d42018-01-02 14:26:50 -08002524 for (const DexInstructionPcPair& inst : clinit->DexInstructions()) {
Mathieu Chartier2b2bef22017-10-26 17:10:19 -07002525 if (inst->Opcode() == Instruction::CONST_STRING) {
Andreas Gampe7bf90482017-03-02 16:41:35 -08002526 ObjPtr<mirror::String> s = class_linker->ResolveString(
Vladimir Markoa64b52d2017-12-08 16:27:49 +00002527 dex::StringIndex(inst->VRegB_21c()), dex_cache);
Andreas Gampe7bf90482017-03-02 16:41:35 -08002528 CHECK(s != nullptr);
Mathieu Chartier2b2bef22017-10-26 17:10:19 -07002529 } else if (inst->Opcode() == Instruction::CONST_STRING_JUMBO) {
Andreas Gampe7bf90482017-03-02 16:41:35 -08002530 ObjPtr<mirror::String> s = class_linker->ResolveString(
Vladimir Markoa64b52d2017-12-08 16:27:49 +00002531 dex::StringIndex(inst->VRegB_31c()), dex_cache);
Andreas Gampe7bf90482017-03-02 16:41:35 -08002532 CHECK(s != nullptr);
2533 }
Andreas Gampe7bf90482017-03-02 16:41:35 -08002534 }
2535 }
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002536 }
2537
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002538 bool ResolveTypesOfMethods(Thread* self, ArtMethod* m)
2539 REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Markob45528c2017-07-27 14:14:28 +01002540 // Return value of ResolveReturnType() is discarded because resolve will be done internally.
2541 ObjPtr<mirror::Class> rtn_type = m->ResolveReturnType();
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002542 if (rtn_type == nullptr) {
2543 self->ClearException();
2544 return false;
2545 }
2546 const DexFile::TypeList* types = m->GetParameterTypeList();
2547 if (types != nullptr) {
2548 for (uint32_t i = 0; i < types->Size(); ++i) {
2549 dex::TypeIndex param_type_idx = types->GetTypeItem(i).type_idx_;
Vladimir Markob45528c2017-07-27 14:14:28 +01002550 ObjPtr<mirror::Class> param_type = m->ResolveClassFromTypeIndex(param_type_idx);
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002551 if (param_type == nullptr) {
2552 self->ClearException();
2553 return false;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002554 }
2555 }
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002556 }
2557 return true;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002558 }
2559
2560 // Pre resolve types mentioned in all method signatures before start a transaction
2561 // since ResolveType doesn't work in transaction mode.
2562 bool PreResolveTypes(Thread* self, const Handle<mirror::Class>& klass)
2563 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002564 PointerSize pointer_size = manager_->GetClassLinker()->GetImagePointerSize();
2565 for (ArtMethod& m : klass->GetMethods(pointer_size)) {
2566 if (!ResolveTypesOfMethods(self, &m)) {
2567 return false;
2568 }
2569 }
2570 if (klass->IsInterface()) {
2571 return true;
2572 } else if (klass->HasSuperClass()) {
2573 StackHandleScope<1> hs(self);
2574 MutableHandle<mirror::Class> super_klass(hs.NewHandle<mirror::Class>(klass->GetSuperClass()));
2575 for (int i = super_klass->GetVTableLength() - 1; i >= 0; --i) {
2576 ArtMethod* m = klass->GetVTableEntry(i, pointer_size);
2577 ArtMethod* super_m = super_klass->GetVTableEntry(i, pointer_size);
2578 if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002579 return false;
2580 }
2581 }
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002582 for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) {
2583 super_klass.Assign(klass->GetIfTable()->GetInterface(i));
2584 if (klass->GetClassLoader() != super_klass->GetClassLoader()) {
2585 uint32_t num_methods = super_klass->NumVirtualMethods();
2586 for (uint32_t j = 0; j < num_methods; ++j) {
2587 ArtMethod* m = klass->GetIfTable()->GetMethodArray(i)->GetElementPtrSize<ArtMethod*>(
2588 j, pointer_size);
2589 ArtMethod* super_m = super_klass->GetVirtualMethod(j, pointer_size);
2590 if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
2591 return false;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002592 }
2593 }
2594 }
2595 }
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002596 }
2597 return true;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002598 }
2599
2600 // Initialize the klass's dependencies recursively before initializing itself.
2601 // Checking for interfaces is also necessary since interfaces can contain
2602 // both default methods and static encoded fields.
2603 bool InitializeDependencies(const Handle<mirror::Class>& klass,
2604 Handle<mirror::ClassLoader> class_loader,
2605 Thread* self)
2606 REQUIRES_SHARED(Locks::mutator_lock_) {
2607 if (klass->HasSuperClass()) {
2608 ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
2609 StackHandleScope<1> hs(self);
2610 Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
2611 if (!handle_scope_super->IsInitialized()) {
2612 this->TryInitializeClass(handle_scope_super, class_loader);
2613 if (!handle_scope_super->IsInitialized()) {
2614 return false;
2615 }
2616 }
2617 }
2618
2619 uint32_t num_if = klass->NumDirectInterfaces();
2620 for (size_t i = 0; i < num_if; i++) {
2621 ObjPtr<mirror::Class>
2622 interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
2623 StackHandleScope<1> hs(self);
2624 Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
2625
2626 TryInitializeClass(handle_interface, class_loader);
2627
2628 if (!handle_interface->IsInitialized()) {
2629 return false;
2630 }
2631 }
2632
2633 return PreResolveTypes(self, klass);
2634 }
2635
2636 // In this phase the classes containing class initializers are ignored. Make sure no
2637 // clinit appears in kalss's super class chain and interfaces.
2638 bool NoClinitInDependency(const Handle<mirror::Class>& klass,
2639 Thread* self,
2640 Handle<mirror::ClassLoader>* class_loader)
2641 REQUIRES_SHARED(Locks::mutator_lock_) {
2642 ArtMethod* clinit =
2643 klass->FindClassInitializer(manager_->GetClassLinker()->GetImagePointerSize());
2644 if (clinit != nullptr) {
2645 VLOG(compiler) << klass->PrettyClass() << ' ' << clinit->PrettyMethod(true);
2646 return false;
2647 }
2648 if (klass->HasSuperClass()) {
2649 ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
2650 StackHandleScope<1> hs(self);
2651 Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
2652 if (!NoClinitInDependency(handle_scope_super, self, class_loader)) {
2653 return false;
2654 }
2655 }
2656
2657 uint32_t num_if = klass->NumDirectInterfaces();
2658 for (size_t i = 0; i < num_if; i++) {
2659 ObjPtr<mirror::Class>
2660 interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
2661 StackHandleScope<1> hs(self);
2662 Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
2663 if (!NoClinitInDependency(handle_interface, self, class_loader)) {
2664 return false;
2665 }
2666 }
2667
Chang Xingba17dbd2017-06-28 21:27:56 +00002668 return true;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002669 }
2670
Mathieu Chartier90443472015-07-16 20:32:27 -07002671 const ParallelCompilationManager* const manager_;
2672};
Brian Carlstrom7940e442013-07-12 13:46:57 -07002673
Andreas Gampeace0dc12016-01-20 13:33:13 -08002674void CompilerDriver::InitializeClasses(jobject jni_class_loader,
2675 const DexFile& dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07002676 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002677 TimingLogger* timings) {
Mathieu Chartierf5997b42014-06-20 10:37:54 -07002678 TimingLogger::ScopedTiming t("InitializeNoClinit", timings);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002679
2680 // Initialization allocates objects and needs to run single-threaded to be deterministic.
2681 bool force_determinism = GetCompilerOptions().IsForceDeterminism();
2682 ThreadPool* init_thread_pool = force_determinism
2683 ? single_thread_pool_.get()
2684 : parallel_thread_pool_.get();
2685 size_t init_thread_count = force_determinism ? 1U : parallel_thread_count_;
2686
Brian Carlstrom7940e442013-07-12 13:46:57 -07002687 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
Andreas Gampede7b4362014-07-28 18:38:57 -07002688 ParallelCompilationManager context(class_linker, jni_class_loader, this, &dex_file, dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002689 init_thread_pool);
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002690
2691 if (GetCompilerOptions().IsBootImage() || GetCompilerOptions().IsAppImage()) {
2692 // Set the concurrency thread to 1 to support initialization for App Images since transaction
2693 // doesn't support multithreading now.
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002694 // TODO: remove this when transactional mode supports multithreading.
Andreas Gampeace0dc12016-01-20 13:33:13 -08002695 init_thread_count = 1U;
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002696 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002697 InitializeClassVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002698 context.ForAll(0, dex_file.NumClassDefs(), &visitor, init_thread_count);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002699}
2700
Mathieu Chartier91288d82016-04-28 09:44:54 -07002701class InitializeArrayClassesAndCreateConflictTablesVisitor : public ClassVisitor {
Mathieu Chartier085a0722016-04-01 17:33:31 -07002702 public:
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002703 explicit InitializeArrayClassesAndCreateConflictTablesVisitor(VariableSizedHandleScope& hs)
2704 : hs_(hs) {}
2705
2706 virtual bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE
2707 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier91288d82016-04-28 09:44:54 -07002708 if (Runtime::Current()->GetHeap()->ObjectIsInBootImageSpace(klass)) {
2709 return true;
2710 }
Mathieu Chartier085a0722016-04-01 17:33:31 -07002711 if (klass->IsArrayClass()) {
2712 StackHandleScope<1> hs(Thread::Current());
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002713 auto h_klass = hs.NewHandleWrapper(&klass);
2714 Runtime::Current()->GetClassLinker()->EnsureInitialized(hs.Self(), h_klass, true, true);
Mathieu Chartier085a0722016-04-01 17:33:31 -07002715 }
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002716 // Collect handles since there may be thread suspension in future EnsureInitialized.
2717 to_visit_.push_back(hs_.NewHandle(klass));
Nicolas Geoffray88f288e2016-06-29 08:17:52 +00002718 return true;
Nelli Kimbadee982016-05-13 13:08:53 +03002719 }
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00002720
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002721 void FillAllIMTAndConflictTables() REQUIRES_SHARED(Locks::mutator_lock_) {
2722 for (Handle<mirror::Class> c : to_visit_) {
2723 // Create the conflict tables.
2724 FillIMTAndConflictTables(c.Get());
2725 }
2726 }
2727
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00002728 private:
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002729 void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass)
2730 REQUIRES_SHARED(Locks::mutator_lock_) {
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00002731 if (!klass->ShouldHaveImt()) {
2732 return;
2733 }
2734 if (visited_classes_.find(klass) != visited_classes_.end()) {
2735 return;
2736 }
2737 if (klass->HasSuperClass()) {
2738 FillIMTAndConflictTables(klass->GetSuperClass());
2739 }
2740 if (!klass->IsTemp()) {
2741 Runtime::Current()->GetClassLinker()->FillIMTAndConflictTables(klass);
2742 }
2743 visited_classes_.insert(klass);
2744 }
2745
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002746 VariableSizedHandleScope& hs_;
2747 std::vector<Handle<mirror::Class>> to_visit_;
2748 std::unordered_set<ObjPtr<mirror::Class>, HashObjPtr> visited_classes_;
Mathieu Chartier085a0722016-04-01 17:33:31 -07002749};
2750
Brian Carlstrom7940e442013-07-12 13:46:57 -07002751void CompilerDriver::InitializeClasses(jobject class_loader,
2752 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002753 TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07002754 for (size_t i = 0; i != dex_files.size(); ++i) {
2755 const DexFile* dex_file = dex_files[i];
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002756 CHECK(dex_file != nullptr);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002757 InitializeClasses(class_loader, *dex_file, dex_files, timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002758 }
Vladimir Markoaad75c62016-10-03 08:46:48 +00002759 if (GetCompilerOptions().IsBootImage() || GetCompilerOptions().IsAppImage()) {
Mathieu Chartier085a0722016-04-01 17:33:31 -07002760 // Make sure that we call EnsureIntiailized on all the array classes to call
2761 // SetVerificationAttempted so that the access flags are set. If we do not do this they get
2762 // changed at runtime resulting in more dirty image pages.
Mathieu Chartier91288d82016-04-28 09:44:54 -07002763 // Also create conflict tables.
2764 // Only useful if we are compiling an image (image_classes_ is not null).
Mathieu Chartier085a0722016-04-01 17:33:31 -07002765 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002766 VariableSizedHandleScope hs(soa.Self());
2767 InitializeArrayClassesAndCreateConflictTablesVisitor visitor(hs);
Mathieu Chartier91288d82016-04-28 09:44:54 -07002768 Runtime::Current()->GetClassLinker()->VisitClassesWithoutClassesLock(&visitor);
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002769 visitor.FillAllIMTAndConflictTables();
Mathieu Chartier085a0722016-04-01 17:33:31 -07002770 }
Vladimir Markoaad75c62016-10-03 08:46:48 +00002771 if (GetCompilerOptions().IsBootImage()) {
Mathieu Chartier093ef212014-08-11 13:52:12 -07002772 // Prune garbage objects created during aborted transactions.
Roland Levillainaf290312018-02-27 20:02:17 +00002773 Runtime::Current()->GetHeap()->CollectGarbage(/* clear_soft_references */ true);
Mathieu Chartier093ef212014-08-11 13:52:12 -07002774 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002775}
2776
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002777template <typename CompileFn>
2778static void CompileDexFile(CompilerDriver* driver,
2779 jobject class_loader,
2780 const DexFile& dex_file,
2781 const std::vector<const DexFile*>& dex_files,
2782 ThreadPool* thread_pool,
2783 size_t thread_count,
2784 TimingLogger* timings,
2785 const char* timing_name,
2786 CompileFn compile_fn) {
2787 TimingLogger::ScopedTiming t(timing_name, timings);
2788 ParallelCompilationManager context(Runtime::Current()->GetClassLinker(),
2789 class_loader,
2790 driver,
2791 &dex_file,
2792 dex_files,
2793 thread_pool);
Vladimir Marko492a7fa2016-06-01 18:38:43 +01002794
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002795 auto compile = [&context, &compile_fn](size_t class_def_index) {
Andreas Gampe9b827ab2017-12-07 19:32:48 -08002796 ScopedTrace trace(__FUNCTION__);
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002797 const DexFile& dex_file = *context.GetDexFile();
Mathieu Chartier90443472015-07-16 20:32:27 -07002798 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002799 ClassLinker* class_linker = context.GetClassLinker();
2800 jobject jclass_loader = context.GetClassLoader();
Mathieu Chartier90443472015-07-16 20:32:27 -07002801 ClassReference ref(&dex_file, class_def_index);
2802 // Skip compiling classes with generic verifier failures since they will still fail at runtime
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002803 if (context.GetCompiler()->GetVerificationResults()->IsClassRejected(ref)) {
Ian Rogers1ff3c982014-08-12 02:30:58 -07002804 return;
2805 }
Mathieu Chartier736b5602015-09-02 14:54:11 -07002806 // Use a scoped object access to perform to the quick SkipClass check.
2807 const char* descriptor = dex_file.GetClassDescriptor(class_def);
2808 ScopedObjectAccess soa(Thread::Current());
2809 StackHandleScope<3> hs(soa.Self());
2810 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002811 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier736b5602015-09-02 14:54:11 -07002812 Handle<mirror::Class> klass(
2813 hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2814 Handle<mirror::DexCache> dex_cache;
Andreas Gampefa4333d2017-02-14 11:10:34 -08002815 if (klass == nullptr) {
Mathieu Chartier736b5602015-09-02 14:54:11 -07002816 soa.Self()->AssertPendingException();
2817 soa.Self()->ClearException();
2818 dex_cache = hs.NewHandle(class_linker->FindDexCache(soa.Self(), dex_file));
2819 } else if (SkipClass(jclass_loader, dex_file, klass.Get())) {
2820 return;
2821 } else {
2822 dex_cache = hs.NewHandle(klass->GetDexCache());
2823 }
2824
Mathieu Chartier90443472015-07-16 20:32:27 -07002825 const uint8_t* class_data = dex_file.GetClassData(class_def);
2826 if (class_data == nullptr) {
2827 // empty class, probably a marker interface
2828 return;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002829 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002830
Mathieu Chartier736b5602015-09-02 14:54:11 -07002831 // Go to native so that we don't block GC during compilation.
Mathieu Chartierf1d666e2015-09-03 16:13:34 -07002832 ScopedThreadSuspension sts(soa.Self(), kNative);
Mathieu Chartier736b5602015-09-02 14:54:11 -07002833
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002834 CompilerDriver* const driver = context.GetCompiler();
Mathieu Chartier90443472015-07-16 20:32:27 -07002835
2836 // Can we run DEX-to-DEX compiler on this class ?
Mathieu Chartiera79efdb2018-01-18 16:31:01 -08002837 optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level =
Mathieu Chartier736b5602015-09-02 14:54:11 -07002838 GetDexToDexCompilationLevel(soa.Self(), *driver, jclass_loader, dex_file, class_def);
Andreas Gampe5eb0d382015-07-23 01:19:26 -07002839
Mathieu Chartier90443472015-07-16 20:32:27 -07002840 ClassDataItemIterator it(dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -07002841 it.SkipAllFields();
Mathieu Chartier90443472015-07-16 20:32:27 -07002842
2843 bool compilation_enabled = driver->IsClassToCompile(
2844 dex_file.StringByTypeIdx(class_def.class_idx_));
2845
Mathieu Chartierb7c273c2017-11-10 18:07:56 -08002846 // Compile direct and virtual methods.
2847 int64_t previous_method_idx = -1;
2848 while (it.HasNextMethod()) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002849 uint32_t method_idx = it.GetMemberIndex();
Mathieu Chartierb7c273c2017-11-10 18:07:56 -08002850 if (method_idx == previous_method_idx) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002851 // smali can create dex files with two encoded_methods sharing the same method_idx
2852 // http://code.google.com/p/smali/issues/detail?id=119
2853 it.Next();
2854 continue;
2855 }
Mathieu Chartierb7c273c2017-11-10 18:07:56 -08002856 previous_method_idx = method_idx;
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002857 compile_fn(soa.Self(),
2858 driver,
2859 it.GetMethodCodeItem(),
2860 it.GetMethodAccessFlags(),
2861 it.GetMethodInvokeType(class_def),
2862 class_def_index,
2863 method_idx,
2864 class_loader,
2865 dex_file,
2866 dex_to_dex_compilation_level,
2867 compilation_enabled,
2868 dex_cache);
Mathieu Chartier90443472015-07-16 20:32:27 -07002869 it.Next();
2870 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002871 DCHECK(!it.HasNext());
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002872 };
2873 context.ForAllLambda(0, dex_file.NumClassDefs(), compile, thread_count);
2874}
2875
2876void CompilerDriver::Compile(jobject class_loader,
2877 const std::vector<const DexFile*>& dex_files,
2878 TimingLogger* timings) {
2879 if (kDebugProfileGuidedCompilation) {
2880 LOG(INFO) << "[ProfileGuidedCompilation] " <<
2881 ((profile_compilation_info_ == nullptr)
2882 ? "null"
2883 : profile_compilation_info_->DumpInfo(&dex_files));
Brian Carlstrom7940e442013-07-12 13:46:57 -07002884 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002885
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002886 dex_to_dex_compiler_.ClearState();
2887 for (const DexFile* dex_file : dex_files) {
2888 CHECK(dex_file != nullptr);
2889 CompileDexFile(this,
2890 class_loader,
2891 *dex_file,
2892 dex_files,
2893 parallel_thread_pool_.get(),
2894 parallel_thread_count_,
2895 timings,
2896 "Compile Dex File Quick",
2897 CompileMethodQuick);
2898 const ArenaPool* const arena_pool = Runtime::Current()->GetArenaPool();
2899 const size_t arena_alloc = arena_pool->GetBytesAllocated();
2900 max_arena_alloc_ = std::max(arena_alloc, max_arena_alloc_);
2901 Runtime::Current()->ReclaimArenaPoolMemory();
2902 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002903
Mathieu Chartier279e3a32018-01-24 18:17:55 -08002904 if (dex_to_dex_compiler_.NumCodeItemsToQuicken(Thread::Current()) > 0u) {
Andreas Gampe3c060ad2018-01-22 13:07:49 -08002905 // TODO: Not visit all of the dex files, its probably rare that only one would have quickened
2906 // methods though.
2907 for (const DexFile* dex_file : dex_files) {
2908 CompileDexFile(this,
2909 class_loader,
2910 *dex_file,
2911 dex_files,
2912 parallel_thread_pool_.get(),
2913 parallel_thread_count_,
2914 timings,
2915 "Compile Dex File Dex2Dex",
2916 CompileMethodDex2Dex);
2917 }
2918 dex_to_dex_compiler_.ClearState();
2919 }
2920
2921 VLOG(compiler) << "Compile: " << GetMemoryUsageString(false);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002922}
2923
Andreas Gampe5eb0d382015-07-23 01:19:26 -07002924void CompilerDriver::AddCompiledMethod(const MethodReference& method_ref,
2925 CompiledMethod* const compiled_method,
2926 size_t non_relative_linker_patch_count) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002927 DCHECK(GetCompiledMethod(method_ref) == nullptr) << method_ref.PrettyMethod();
2928 MethodTable::InsertResult result = compiled_methods_.Insert(method_ref,
2929 /*expected*/ nullptr,
2930 compiled_method);
Mathieu Chartieracab8d42016-11-23 13:45:58 -08002931 CHECK(result == MethodTable::kInsertResultSuccess);
Orion Hodson88591fe2018-03-06 13:35:43 +00002932 non_relative_linker_patch_count_.fetch_add(non_relative_linker_patch_count,
2933 std::memory_order_relaxed);
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002934 DCHECK(GetCompiledMethod(method_ref) != nullptr) << method_ref.PrettyMethod();
Brian Carlstrom7940e442013-07-12 13:46:57 -07002935}
2936
Mathieu Chartier279e3a32018-01-24 18:17:55 -08002937CompiledMethod* CompilerDriver::RemoveCompiledMethod(const MethodReference& method_ref) {
2938 CompiledMethod* ret = nullptr;
2939 CHECK(compiled_methods_.Remove(method_ref, &ret));
2940 return ret;
2941}
2942
Vladimir Marko2c64a832018-01-04 11:31:56 +00002943bool CompilerDriver::GetCompiledClass(const ClassReference& ref, ClassStatus* status) const {
Andreas Gampebb846102017-05-11 21:03:35 -07002944 DCHECK(status != nullptr);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002945 // The table doesn't know if something wasn't inserted. For this case it will return
Vladimir Marko2c64a832018-01-04 11:31:56 +00002946 // ClassStatus::kNotReady. To handle this, just assume anything we didn't try to verify
2947 // is not compiled.
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002948 if (!compiled_classes_.Get(ref, status) ||
Vladimir Marko2c64a832018-01-04 11:31:56 +00002949 *status < ClassStatus::kRetryVerificationAtRuntime) {
Andreas Gampebb846102017-05-11 21:03:35 -07002950 return false;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002951 }
Andreas Gampebb846102017-05-11 21:03:35 -07002952 return true;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002953}
2954
Vladimir Marko2c64a832018-01-04 11:31:56 +00002955ClassStatus CompilerDriver::GetClassStatus(const ClassReference& ref) const {
2956 ClassStatus status = ClassStatus::kNotReady;
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002957 if (!GetCompiledClass(ref, &status)) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002958 classpath_classes_.Get(ref, &status);
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002959 }
2960 return status;
2961}
2962
Vladimir Marko2c64a832018-01-04 11:31:56 +00002963void CompilerDriver::RecordClassStatus(const ClassReference& ref, ClassStatus status) {
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002964 switch (status) {
Vladimir Marko2c64a832018-01-04 11:31:56 +00002965 case ClassStatus::kErrorResolved:
2966 case ClassStatus::kErrorUnresolved:
2967 case ClassStatus::kNotReady:
2968 case ClassStatus::kResolved:
2969 case ClassStatus::kRetryVerificationAtRuntime:
2970 case ClassStatus::kVerified:
2971 case ClassStatus::kSuperclassValidated:
2972 case ClassStatus::kInitialized:
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002973 break; // Expected states.
2974 default:
2975 LOG(FATAL) << "Unexpected class status for class "
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002976 << PrettyDescriptor(
2977 ref.dex_file->GetClassDescriptor(ref.dex_file->GetClassDef(ref.index)))
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002978 << " of " << status;
2979 }
2980
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002981 ClassStateTable::InsertResult result;
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002982 ClassStateTable* table = &compiled_classes_;
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002983 do {
Vladimir Marko2c64a832018-01-04 11:31:56 +00002984 ClassStatus existing = ClassStatus::kNotReady;
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002985 if (!table->Get(ref, &existing)) {
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002986 // A classpath class.
Mathieu Chartier010f5cc2017-07-24 15:53:46 -07002987 if (kIsDebugBuild) {
2988 // Check to make sure it's not a dex file for an oat file we are compiling since these
2989 // should always succeed. These do not include classes in for used libraries.
Mathieu Chartier72041a02017-07-14 18:23:25 -07002990 for (const DexFile* dex_file : GetDexFilesForOatFile()) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002991 CHECK_NE(ref.dex_file, dex_file) << ref.dex_file->GetLocation();
Mathieu Chartier010f5cc2017-07-24 15:53:46 -07002992 }
2993 }
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002994 if (!classpath_classes_.HaveDexFile(ref.dex_file)) {
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002995 // Boot classpath dex file.
2996 return;
2997 }
2998 table = &classpath_classes_;
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002999 table->Get(ref, &existing);
Mathieu Chartier010f5cc2017-07-24 15:53:46 -07003000 }
Mathieu Chartier1a088d42017-07-18 11:43:57 -07003001 if (existing >= status) {
3002 // Existing status is already better than we expect, break.
3003 break;
3004 }
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00003005 // Update the status if we now have a greater one. This happens with vdex,
3006 // which records a class is verified, but does not resolve it.
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07003007 result = table->Insert(ref, existing, status);
3008 CHECK(result != ClassStateTable::kInsertResultInvalidDexFile) << ref.dex_file->GetLocation();
Mathieu Chartier1a088d42017-07-18 11:43:57 -07003009 } while (result != ClassStateTable::kInsertResultSuccess);
Ian Rogers8f3c9ae2013-08-20 17:26:41 -07003010}
3011
Brian Carlstrom7940e442013-07-12 13:46:57 -07003012CompiledMethod* CompilerDriver::GetCompiledMethod(MethodReference ref) const {
Mathieu Chartieracab8d42016-11-23 13:45:58 -08003013 CompiledMethod* compiled_method = nullptr;
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07003014 compiled_methods_.Get(ref, &compiled_method);
Mathieu Chartieracab8d42016-11-23 13:45:58 -08003015 return compiled_method;
Brian Carlstrom7940e442013-07-12 13:46:57 -07003016}
3017
Calin Juravlef1c6d9e2015-04-13 18:42:21 +01003018bool CompilerDriver::IsMethodVerifiedWithoutFailures(uint32_t method_idx,
3019 uint16_t class_def_idx,
3020 const DexFile& dex_file) const {
3021 const VerifiedMethod* verified_method = GetVerifiedMethod(&dex_file, method_idx);
3022 if (verified_method != nullptr) {
3023 return !verified_method->HasVerificationFailures();
3024 }
3025
3026 // If we can't find verification metadata, check if this is a system class (we trust that system
3027 // classes have their methods verified). If it's not, be conservative and assume the method
3028 // has not been verified successfully.
3029
3030 // TODO: When compiling the boot image it should be safe to assume that everything is verified,
3031 // even if methods are not found in the verification cache.
3032 const char* descriptor = dex_file.GetClassDescriptor(dex_file.GetClassDef(class_def_idx));
3033 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
3034 Thread* self = Thread::Current();
3035 ScopedObjectAccess soa(self);
3036 bool is_system_class = class_linker->FindSystemClass(self, descriptor) != nullptr;
3037 if (!is_system_class) {
3038 self->ClearException();
3039 }
3040 return is_system_class;
3041}
3042
Vladimir Markof4da6752014-08-01 19:04:18 +01003043size_t CompilerDriver::GetNonRelativeLinkerPatchCount() const {
Orion Hodson88591fe2018-03-06 13:35:43 +00003044 return non_relative_linker_patch_count_.load(std::memory_order_relaxed);
Vladimir Markof4da6752014-08-01 19:04:18 +01003045}
3046
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07003047void CompilerDriver::SetRequiresConstructorBarrier(Thread* self,
3048 const DexFile* dex_file,
3049 uint16_t class_def_index,
3050 bool requires) {
3051 WriterMutexLock mu(self, requires_constructor_barrier_lock_);
3052 requires_constructor_barrier_.emplace(ClassReference(dex_file, class_def_index), requires);
Brian Carlstrom7940e442013-07-12 13:46:57 -07003053}
3054
Mathieu Chartier371bd832016-04-07 10:19:48 -07003055bool CompilerDriver::RequiresConstructorBarrier(Thread* self,
3056 const DexFile* dex_file,
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07003057 uint16_t class_def_index) {
3058 ClassReference class_ref(dex_file, class_def_index);
3059 {
3060 ReaderMutexLock mu(self, requires_constructor_barrier_lock_);
3061 auto it = requires_constructor_barrier_.find(class_ref);
3062 if (it != requires_constructor_barrier_.end()) {
3063 return it->second;
3064 }
Mathieu Chartierb5d38612016-04-07 10:52:52 -07003065 }
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07003066 WriterMutexLock mu(self, requires_constructor_barrier_lock_);
3067 const bool requires = RequiresConstructorBarrier(*dex_file, class_def_index);
3068 requires_constructor_barrier_.emplace(class_ref, requires);
3069 return requires;
Brian Carlstrom7940e442013-07-12 13:46:57 -07003070}
3071
Andreas Gampe8d295f82015-01-20 14:50:21 -08003072std::string CompilerDriver::GetMemoryUsageString(bool extended) const {
Mathieu Chartierab972ef2014-12-03 17:38:22 -08003073 std::ostringstream oss;
Calin Juravle69158982016-03-16 11:53:41 +00003074 const gc::Heap* const heap = Runtime::Current()->GetHeap();
Anton Kirilovdd9473b2016-01-28 15:08:01 +00003075 const size_t java_alloc = heap->GetBytesAllocated();
Calin Juravle69158982016-03-16 11:53:41 +00003076 oss << "arena alloc=" << PrettySize(max_arena_alloc_) << " (" << max_arena_alloc_ << "B)";
Anton Kirilovdd9473b2016-01-28 15:08:01 +00003077 oss << " java alloc=" << PrettySize(java_alloc) << " (" << java_alloc << "B)";
Elliott Hughes7bf5a262015-04-02 20:55:07 -07003078#if defined(__BIONIC__) || defined(__GLIBC__)
Anton Kirilovdd9473b2016-01-28 15:08:01 +00003079 const struct mallinfo info = mallinfo();
Mathieu Chartierab972ef2014-12-03 17:38:22 -08003080 const size_t allocated_space = static_cast<size_t>(info.uordblks);
3081 const size_t free_space = static_cast<size_t>(info.fordblks);
Anton Kirilovdd9473b2016-01-28 15:08:01 +00003082 oss << " native alloc=" << PrettySize(allocated_space) << " (" << allocated_space << "B)"
3083 << " free=" << PrettySize(free_space) << " (" << free_space << "B)";
Mathieu Chartierab972ef2014-12-03 17:38:22 -08003084#endif
Vladimir Marko35831e82015-09-11 11:59:18 +01003085 compiled_method_storage_.DumpMemoryUsage(oss, extended);
Mathieu Chartierab972ef2014-12-03 17:38:22 -08003086 return oss.str();
3087}
3088
Jeff Haodcdc85b2015-12-04 14:06:18 -08003089bool CompilerDriver::MayInlineInternal(const DexFile* inlined_from,
3090 const DexFile* inlined_into) const {
3091 // We're not allowed to inline across dex files if we're the no-inline-from dex file.
3092 if (inlined_from != inlined_into &&
Vladimir Marko47496c22016-01-27 16:15:08 +00003093 compiler_options_->GetNoInlineFromDexFile() != nullptr &&
3094 ContainsElement(*compiler_options_->GetNoInlineFromDexFile(), inlined_from)) {
Jeff Haodcdc85b2015-12-04 14:06:18 -08003095 return false;
3096 }
3097
3098 return true;
3099}
3100
Andreas Gampeace0dc12016-01-20 13:33:13 -08003101void CompilerDriver::InitializeThreadPools() {
3102 size_t parallel_count = parallel_thread_count_ > 0 ? parallel_thread_count_ - 1 : 0;
3103 parallel_thread_pool_.reset(
3104 new ThreadPool("Compiler driver thread pool", parallel_count));
3105 single_thread_pool_.reset(new ThreadPool("Single-threaded Compiler driver thread pool", 0));
3106}
3107
3108void CompilerDriver::FreeThreadPools() {
3109 parallel_thread_pool_.reset();
3110 single_thread_pool_.reset();
3111}
3112
Mathieu Chartier72041a02017-07-14 18:23:25 -07003113void CompilerDriver::SetDexFilesForOatFile(const std::vector<const DexFile*>& dex_files) {
3114 dex_files_for_oat_file_ = dex_files;
Nicolas Geoffray486dda02017-09-11 14:15:52 +01003115 compiled_classes_.AddDexFiles(dex_files);
Mathieu Chartier279e3a32018-01-24 18:17:55 -08003116 dex_to_dex_compiler_.SetDexFiles(dex_files);
Nicolas Geoffray486dda02017-09-11 14:15:52 +01003117}
3118
3119void CompilerDriver::SetClasspathDexFiles(const std::vector<const DexFile*>& dex_files) {
3120 classpath_classes_.AddDexFiles(dex_files);
Mathieu Chartier72041a02017-07-14 18:23:25 -07003121}
3122
Brian Carlstrom7940e442013-07-12 13:46:57 -07003123} // namespace art