compiler_driver.cc revision 87000a948524cba7538ccc5438f6a9ecbd4e347e
1/*
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
19#define ATRACE_TAG ATRACE_TAG_DALVIK
20#include <utils/Trace.h>
21
22#include <unordered_set>
23#include <vector>
24#include <unistd.h>
25
26#ifndef __APPLE__
27#include <malloc.h>  // For mallinfo
28#endif
29
30#include "art_field-inl.h"
31#include "art_method-inl.h"
32#include "base/stl_util.h"
33#include "base/time_utils.h"
34#include "base/timing_logger.h"
35#include "class_linker-inl.h"
36#include "compiled_class.h"
37#include "compiled_method.h"
38#include "compiler.h"
39#include "compiler_driver-inl.h"
40#include "dex_compilation_unit.h"
41#include "dex_file-inl.h"
42#include "dex/dex_to_dex_compiler.h"
43#include "dex/verification_results.h"
44#include "dex/verified_method.h"
45#include "dex/quick/dex_file_method_inliner.h"
46#include "dex/quick/dex_file_to_method_inliner_map.h"
47#include "driver/compiler_options.h"
48#include "elf_writer_quick.h"
49#include "jni_internal.h"
50#include "object_lock.h"
51#include "profiler.h"
52#include "runtime.h"
53#include "gc/accounting/card_table-inl.h"
54#include "gc/accounting/heap_bitmap.h"
55#include "gc/space/image_space.h"
56#include "gc/space/space.h"
57#include "mirror/class_loader.h"
58#include "mirror/class-inl.h"
59#include "mirror/dex_cache-inl.h"
60#include "mirror/object-inl.h"
61#include "mirror/object_array-inl.h"
62#include "mirror/throwable.h"
63#include "scoped_thread_state_change.h"
64#include "ScopedLocalRef.h"
65#include "handle_scope-inl.h"
66#include "thread.h"
67#include "thread_list.h"
68#include "thread_pool.h"
69#include "trampolines/trampoline_compiler.h"
70#include "transaction.h"
71#include "utils/dex_cache_arrays_layout-inl.h"
72#include "utils/swap_space.h"
73#include "verifier/method_verifier.h"
74#include "verifier/method_verifier-inl.h"
75
76namespace art {
77
78static constexpr bool kTimeCompileMethod = !kIsDebugBuild;
79
80// Whether to produce 64-bit ELF files for 64-bit targets.
81static constexpr bool kProduce64BitELFFiles = true;
82
83// Whether classes-to-compile and methods-to-compile are only applied to the boot image, or, when
84// given, too all compilations.
85static constexpr bool kRestrictCompilationFiltersToImage = true;
86
87static double Percentage(size_t x, size_t y) {
88  return 100.0 * (static_cast<double>(x)) / (static_cast<double>(x + y));
89}
90
91static void DumpStat(size_t x, size_t y, const char* str) {
92  if (x == 0 && y == 0) {
93    return;
94  }
95  LOG(INFO) << Percentage(x, y) << "% of " << str << " for " << (x + y) << " cases";
96}
97
98class CompilerDriver::AOTCompilationStats {
99 public:
100  AOTCompilationStats()
101      : stats_lock_("AOT compilation statistics lock"),
102        types_in_dex_cache_(0), types_not_in_dex_cache_(0),
103        strings_in_dex_cache_(0), strings_not_in_dex_cache_(0),
104        resolved_types_(0), unresolved_types_(0),
105        resolved_instance_fields_(0), unresolved_instance_fields_(0),
106        resolved_local_static_fields_(0), resolved_static_fields_(0), unresolved_static_fields_(0),
107        type_based_devirtualization_(0),
108        safe_casts_(0), not_safe_casts_(0) {
109    for (size_t i = 0; i <= kMaxInvokeType; i++) {
110      resolved_methods_[i] = 0;
111      unresolved_methods_[i] = 0;
112      virtual_made_direct_[i] = 0;
113      direct_calls_to_boot_[i] = 0;
114      direct_methods_to_boot_[i] = 0;
115    }
116  }
117
118  void Dump() {
119    DumpStat(types_in_dex_cache_, types_not_in_dex_cache_, "types known to be in dex cache");
120    DumpStat(strings_in_dex_cache_, strings_not_in_dex_cache_, "strings known to be in dex cache");
121    DumpStat(resolved_types_, unresolved_types_, "types resolved");
122    DumpStat(resolved_instance_fields_, unresolved_instance_fields_, "instance fields resolved");
123    DumpStat(resolved_local_static_fields_ + resolved_static_fields_, unresolved_static_fields_,
124             "static fields resolved");
125    DumpStat(resolved_local_static_fields_, resolved_static_fields_ + unresolved_static_fields_,
126             "static fields local to a class");
127    DumpStat(safe_casts_, not_safe_casts_, "check-casts removed based on type information");
128    // Note, the code below subtracts the stat value so that when added to the stat value we have
129    // 100% of samples. TODO: clean this up.
130    DumpStat(type_based_devirtualization_,
131             resolved_methods_[kVirtual] + unresolved_methods_[kVirtual] +
132             resolved_methods_[kInterface] + unresolved_methods_[kInterface] -
133             type_based_devirtualization_,
134             "virtual/interface calls made direct based on type information");
135
136    for (size_t i = 0; i <= kMaxInvokeType; i++) {
137      std::ostringstream oss;
138      oss << static_cast<InvokeType>(i) << " methods were AOT resolved";
139      DumpStat(resolved_methods_[i], unresolved_methods_[i], oss.str().c_str());
140      if (virtual_made_direct_[i] > 0) {
141        std::ostringstream oss2;
142        oss2 << static_cast<InvokeType>(i) << " methods made direct";
143        DumpStat(virtual_made_direct_[i],
144                 resolved_methods_[i] + unresolved_methods_[i] - virtual_made_direct_[i],
145                 oss2.str().c_str());
146      }
147      if (direct_calls_to_boot_[i] > 0) {
148        std::ostringstream oss2;
149        oss2 << static_cast<InvokeType>(i) << " method calls are direct into boot";
150        DumpStat(direct_calls_to_boot_[i],
151                 resolved_methods_[i] + unresolved_methods_[i] - direct_calls_to_boot_[i],
152                 oss2.str().c_str());
153      }
154      if (direct_methods_to_boot_[i] > 0) {
155        std::ostringstream oss2;
156        oss2 << static_cast<InvokeType>(i) << " method calls have methods in boot";
157        DumpStat(direct_methods_to_boot_[i],
158                 resolved_methods_[i] + unresolved_methods_[i] - direct_methods_to_boot_[i],
159                 oss2.str().c_str());
160      }
161    }
162  }
163
164// Allow lossy statistics in non-debug builds.
165#ifndef NDEBUG
166#define STATS_LOCK() MutexLock mu(Thread::Current(), stats_lock_)
167#else
168#define STATS_LOCK()
169#endif
170
171  void TypeInDexCache() REQUIRES(!stats_lock_) {
172    STATS_LOCK();
173    types_in_dex_cache_++;
174  }
175
176  void TypeNotInDexCache() REQUIRES(!stats_lock_) {
177    STATS_LOCK();
178    types_not_in_dex_cache_++;
179  }
180
181  void StringInDexCache() REQUIRES(!stats_lock_) {
182    STATS_LOCK();
183    strings_in_dex_cache_++;
184  }
185
186  void StringNotInDexCache() REQUIRES(!stats_lock_) {
187    STATS_LOCK();
188    strings_not_in_dex_cache_++;
189  }
190
191  void TypeDoesntNeedAccessCheck() REQUIRES(!stats_lock_) {
192    STATS_LOCK();
193    resolved_types_++;
194  }
195
196  void TypeNeedsAccessCheck() REQUIRES(!stats_lock_) {
197    STATS_LOCK();
198    unresolved_types_++;
199  }
200
201  void ResolvedInstanceField() REQUIRES(!stats_lock_) {
202    STATS_LOCK();
203    resolved_instance_fields_++;
204  }
205
206  void UnresolvedInstanceField() REQUIRES(!stats_lock_) {
207    STATS_LOCK();
208    unresolved_instance_fields_++;
209  }
210
211  void ResolvedLocalStaticField() REQUIRES(!stats_lock_) {
212    STATS_LOCK();
213    resolved_local_static_fields_++;
214  }
215
216  void ResolvedStaticField() REQUIRES(!stats_lock_) {
217    STATS_LOCK();
218    resolved_static_fields_++;
219  }
220
221  void UnresolvedStaticField() REQUIRES(!stats_lock_) {
222    STATS_LOCK();
223    unresolved_static_fields_++;
224  }
225
226  // Indicate that type information from the verifier led to devirtualization.
227  void PreciseTypeDevirtualization() REQUIRES(!stats_lock_) {
228    STATS_LOCK();
229    type_based_devirtualization_++;
230  }
231
232  // Indicate that a method of the given type was resolved at compile time.
233  void ResolvedMethod(InvokeType type) REQUIRES(!stats_lock_) {
234    DCHECK_LE(type, kMaxInvokeType);
235    STATS_LOCK();
236    resolved_methods_[type]++;
237  }
238
239  // Indicate that a method of the given type was unresolved at compile time as it was in an
240  // unknown dex file.
241  void UnresolvedMethod(InvokeType type) REQUIRES(!stats_lock_) {
242    DCHECK_LE(type, kMaxInvokeType);
243    STATS_LOCK();
244    unresolved_methods_[type]++;
245  }
246
247  // Indicate that a type of virtual method dispatch has been converted into a direct method
248  // dispatch.
249  void VirtualMadeDirect(InvokeType type) REQUIRES(!stats_lock_) {
250    DCHECK(type == kVirtual || type == kInterface || type == kSuper);
251    STATS_LOCK();
252    virtual_made_direct_[type]++;
253  }
254
255  // Indicate that a method of the given type was able to call directly into boot.
256  void DirectCallsToBoot(InvokeType type) REQUIRES(!stats_lock_) {
257    DCHECK_LE(type, kMaxInvokeType);
258    STATS_LOCK();
259    direct_calls_to_boot_[type]++;
260  }
261
262  // Indicate that a method of the given type was able to be resolved directly from boot.
263  void DirectMethodsToBoot(InvokeType type) REQUIRES(!stats_lock_) {
264    DCHECK_LE(type, kMaxInvokeType);
265    STATS_LOCK();
266    direct_methods_to_boot_[type]++;
267  }
268
269  void ProcessedInvoke(InvokeType type, int flags) REQUIRES(!stats_lock_) {
270    STATS_LOCK();
271    if (flags == 0) {
272      unresolved_methods_[type]++;
273    } else {
274      DCHECK_NE((flags & kFlagMethodResolved), 0);
275      resolved_methods_[type]++;
276      if ((flags & kFlagVirtualMadeDirect) != 0) {
277        virtual_made_direct_[type]++;
278        if ((flags & kFlagPreciseTypeDevirtualization) != 0) {
279          type_based_devirtualization_++;
280        }
281      } else {
282        DCHECK_EQ((flags & kFlagPreciseTypeDevirtualization), 0);
283      }
284      if ((flags & kFlagDirectCallToBoot) != 0) {
285        direct_calls_to_boot_[type]++;
286      }
287      if ((flags & kFlagDirectMethodToBoot) != 0) {
288        direct_methods_to_boot_[type]++;
289      }
290    }
291  }
292
293  // A check-cast could be eliminated due to verifier type analysis.
294  void SafeCast() REQUIRES(!stats_lock_) {
295    STATS_LOCK();
296    safe_casts_++;
297  }
298
299  // A check-cast couldn't be eliminated due to verifier type analysis.
300  void NotASafeCast() REQUIRES(!stats_lock_) {
301    STATS_LOCK();
302    not_safe_casts_++;
303  }
304
305 private:
306  Mutex stats_lock_;
307
308  size_t types_in_dex_cache_;
309  size_t types_not_in_dex_cache_;
310
311  size_t strings_in_dex_cache_;
312  size_t strings_not_in_dex_cache_;
313
314  size_t resolved_types_;
315  size_t unresolved_types_;
316
317  size_t resolved_instance_fields_;
318  size_t unresolved_instance_fields_;
319
320  size_t resolved_local_static_fields_;
321  size_t resolved_static_fields_;
322  size_t unresolved_static_fields_;
323  // Type based devirtualization for invoke interface and virtual.
324  size_t type_based_devirtualization_;
325
326  size_t resolved_methods_[kMaxInvokeType + 1];
327  size_t unresolved_methods_[kMaxInvokeType + 1];
328  size_t virtual_made_direct_[kMaxInvokeType + 1];
329  size_t direct_calls_to_boot_[kMaxInvokeType + 1];
330  size_t direct_methods_to_boot_[kMaxInvokeType + 1];
331
332  size_t safe_casts_;
333  size_t not_safe_casts_;
334
335  DISALLOW_COPY_AND_ASSIGN(AOTCompilationStats);
336};
337
338CompilerDriver::CompilerDriver(const CompilerOptions* compiler_options,
339                               VerificationResults* verification_results,
340                               DexFileToMethodInlinerMap* method_inliner_map,
341                               Compiler::Kind compiler_kind,
342                               InstructionSet instruction_set,
343                               const InstructionSetFeatures* instruction_set_features,
344                               bool image, std::unordered_set<std::string>* image_classes,
345                               std::unordered_set<std::string>* compiled_classes,
346                               std::unordered_set<std::string>* compiled_methods,
347                               size_t thread_count, bool dump_stats, bool dump_passes,
348                               const std::string& dump_cfg_file_name, bool dump_cfg_append,
349                               CumulativeLogger* timer, int swap_fd,
350                               const std::string& profile_file)
351    : swap_space_(swap_fd == -1 ? nullptr : new SwapSpace(swap_fd, 10 * MB)),
352      swap_space_allocator_(new SwapAllocator<void>(swap_space_.get())),
353      profile_present_(false), compiler_options_(compiler_options),
354      verification_results_(verification_results),
355      method_inliner_map_(method_inliner_map),
356      compiler_(Compiler::Create(this, compiler_kind)),
357      compiler_kind_(compiler_kind),
358      instruction_set_(instruction_set),
359      instruction_set_features_(instruction_set_features),
360      freezing_constructor_lock_("freezing constructor lock"),
361      compiled_classes_lock_("compiled classes lock"),
362      compiled_methods_lock_("compiled method lock"),
363      compiled_methods_(MethodTable::key_compare()),
364      non_relative_linker_patch_count_(0u),
365      image_(image),
366      image_classes_(image_classes),
367      classes_to_compile_(compiled_classes),
368      methods_to_compile_(compiled_methods),
369      had_hard_verifier_failure_(false),
370      thread_count_(thread_count),
371      stats_(new AOTCompilationStats),
372      dedupe_enabled_(true),
373      dump_stats_(dump_stats),
374      dump_passes_(dump_passes),
375      dump_cfg_file_name_(dump_cfg_file_name),
376      dump_cfg_append_(dump_cfg_append),
377      timings_logger_(timer),
378      compiler_context_(nullptr),
379      support_boot_image_fixup_(instruction_set != kMips && instruction_set != kMips64),
380      dedupe_code_("dedupe code", *swap_space_allocator_),
381      dedupe_src_mapping_table_("dedupe source mapping table", *swap_space_allocator_),
382      dedupe_mapping_table_("dedupe mapping table", *swap_space_allocator_),
383      dedupe_vmap_table_("dedupe vmap table", *swap_space_allocator_),
384      dedupe_gc_map_("dedupe gc map", *swap_space_allocator_),
385      dedupe_cfi_info_("dedupe cfi info", *swap_space_allocator_) {
386  DCHECK(compiler_options_ != nullptr);
387  DCHECK(verification_results_ != nullptr);
388  DCHECK(method_inliner_map_ != nullptr);
389
390  compiler_->Init();
391
392  CHECK_EQ(image_, image_classes_.get() != nullptr);
393
394  // Read the profile file if one is provided.
395  if (!profile_file.empty()) {
396    profile_present_ = profile_file_.LoadFile(profile_file);
397    if (profile_present_) {
398      LOG(INFO) << "Using profile data form file " << profile_file;
399    } else {
400      LOG(INFO) << "Failed to load profile file " << profile_file;
401    }
402  }
403}
404
405SwapVector<uint8_t>* CompilerDriver::DeduplicateCode(const ArrayRef<const uint8_t>& code) {
406  DCHECK(dedupe_enabled_);
407  return dedupe_code_.Add(Thread::Current(), code);
408}
409
410SwapSrcMap* CompilerDriver::DeduplicateSrcMappingTable(const ArrayRef<SrcMapElem>& src_map) {
411  DCHECK(dedupe_enabled_);
412  return dedupe_src_mapping_table_.Add(Thread::Current(), src_map);
413}
414
415SwapVector<uint8_t>* CompilerDriver::DeduplicateMappingTable(const ArrayRef<const uint8_t>& code) {
416  DCHECK(dedupe_enabled_);
417  return dedupe_mapping_table_.Add(Thread::Current(), code);
418}
419
420SwapVector<uint8_t>* CompilerDriver::DeduplicateVMapTable(const ArrayRef<const uint8_t>& code) {
421  DCHECK(dedupe_enabled_);
422  return dedupe_vmap_table_.Add(Thread::Current(), code);
423}
424
425SwapVector<uint8_t>* CompilerDriver::DeduplicateGCMap(const ArrayRef<const uint8_t>& code) {
426  DCHECK(dedupe_enabled_);
427  return dedupe_gc_map_.Add(Thread::Current(), code);
428}
429
430SwapVector<uint8_t>* CompilerDriver::DeduplicateCFIInfo(const ArrayRef<const uint8_t>& cfi_info) {
431  DCHECK(dedupe_enabled_);
432  return dedupe_cfi_info_.Add(Thread::Current(), cfi_info);
433}
434
435CompilerDriver::~CompilerDriver() {
436  Thread* self = Thread::Current();
437  {
438    MutexLock mu(self, compiled_classes_lock_);
439    STLDeleteValues(&compiled_classes_);
440  }
441  {
442    MutexLock mu(self, compiled_methods_lock_);
443    for (auto& pair : compiled_methods_) {
444      CompiledMethod::ReleaseSwapAllocatedCompiledMethod(this, pair.second);
445    }
446  }
447  compiler_->UnInit();
448}
449
450#define CREATE_TRAMPOLINE(type, abi, offset) \
451    if (Is64BitInstructionSet(instruction_set_)) { \
452      return CreateTrampoline64(instruction_set_, abi, \
453                                type ## _ENTRYPOINT_OFFSET(8, offset)); \
454    } else { \
455      return CreateTrampoline32(instruction_set_, abi, \
456                                type ## _ENTRYPOINT_OFFSET(4, offset)); \
457    }
458
459const std::vector<uint8_t>* CompilerDriver::CreateInterpreterToInterpreterBridge() const {
460  CREATE_TRAMPOLINE(INTERPRETER, kInterpreterAbi, pInterpreterToInterpreterBridge)
461}
462
463const std::vector<uint8_t>* CompilerDriver::CreateInterpreterToCompiledCodeBridge() const {
464  CREATE_TRAMPOLINE(INTERPRETER, kInterpreterAbi, pInterpreterToCompiledCodeBridge)
465}
466
467const std::vector<uint8_t>* CompilerDriver::CreateJniDlsymLookup() const {
468  CREATE_TRAMPOLINE(JNI, kJniAbi, pDlsymLookup)
469}
470
471const std::vector<uint8_t>* CompilerDriver::CreateQuickGenericJniTrampoline() const {
472  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickGenericJniTrampoline)
473}
474
475const std::vector<uint8_t>* CompilerDriver::CreateQuickImtConflictTrampoline() const {
476  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickImtConflictTrampoline)
477}
478
479const std::vector<uint8_t>* CompilerDriver::CreateQuickResolutionTrampoline() const {
480  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickResolutionTrampoline)
481}
482
483const std::vector<uint8_t>* CompilerDriver::CreateQuickToInterpreterBridge() const {
484  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickToInterpreterBridge)
485}
486#undef CREATE_TRAMPOLINE
487
488void CompilerDriver::CompileAll(jobject class_loader,
489                                const std::vector<const DexFile*>& dex_files,
490                                TimingLogger* timings) {
491  DCHECK(!Runtime::Current()->IsStarted());
492  std::unique_ptr<ThreadPool> thread_pool(
493      new ThreadPool("Compiler driver thread pool", thread_count_ - 1));
494  VLOG(compiler) << "Before precompile " << GetMemoryUsageString(false);
495  PreCompile(class_loader, dex_files, thread_pool.get(), timings);
496  Compile(class_loader, dex_files, thread_pool.get(), timings);
497  if (dump_stats_) {
498    stats_->Dump();
499  }
500}
501
502static optimizer::DexToDexCompilationLevel GetDexToDexCompilationLevel(
503    Thread* self, const CompilerDriver& driver, Handle<mirror::ClassLoader> class_loader,
504    const DexFile& dex_file, const DexFile::ClassDef& class_def)
505    SHARED_REQUIRES(Locks::mutator_lock_) {
506  auto* const runtime = Runtime::Current();
507  if (runtime->UseJit() || driver.GetCompilerOptions().VerifyAtRuntime()) {
508    // Verify at runtime shouldn't dex to dex since we didn't resolve of verify.
509    return optimizer::DexToDexCompilationLevel::kDontDexToDexCompile;
510  }
511  const char* descriptor = dex_file.GetClassDescriptor(class_def);
512  ClassLinker* class_linker = runtime->GetClassLinker();
513  mirror::Class* klass = class_linker->FindClass(self, descriptor, class_loader);
514  if (klass == nullptr) {
515    CHECK(self->IsExceptionPending());
516    self->ClearException();
517    return optimizer::DexToDexCompilationLevel::kDontDexToDexCompile;
518  }
519  // DexToDex at the kOptimize level may introduce quickened opcodes, which replace symbolic
520  // references with actual offsets. We cannot re-verify such instructions.
521  //
522  // We store the verification information in the class status in the oat file, which the linker
523  // can validate (checksums) and use to skip load-time verification. It is thus safe to
524  // optimize when a class has been fully verified before.
525  if (klass->IsVerified()) {
526    // Class is verified so we can enable DEX-to-DEX compilation for performance.
527    return optimizer::DexToDexCompilationLevel::kOptimize;
528  } else if (klass->IsCompileTimeVerified()) {
529    // Class verification has soft-failed. Anyway, ensure at least correctness.
530    DCHECK_EQ(klass->GetStatus(), mirror::Class::kStatusRetryVerificationAtRuntime);
531    return optimizer::DexToDexCompilationLevel::kRequired;
532  } else {
533    // Class verification has failed: do not run DEX-to-DEX compilation.
534    return optimizer::DexToDexCompilationLevel::kDontDexToDexCompile;
535  }
536}
537
538static optimizer::DexToDexCompilationLevel GetDexToDexCompilationLevel(
539    Thread* self,
540    const CompilerDriver& driver,
541    jobject jclass_loader,
542    const DexFile& dex_file,
543    const DexFile::ClassDef& class_def) {
544  ScopedObjectAccess soa(self);
545  StackHandleScope<1> hs(soa.Self());
546  Handle<mirror::ClassLoader> class_loader(
547      hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
548  return GetDexToDexCompilationLevel(self, driver, class_loader, dex_file, class_def);
549}
550
551// Does the runtime for the InstructionSet provide an implementation returned by
552// GetQuickGenericJniStub allowing down calls that aren't compiled using a JNI compiler?
553static bool InstructionSetHasGenericJniStub(InstructionSet isa) {
554  switch (isa) {
555    case kArm:
556    case kArm64:
557    case kThumb2:
558    case kMips:
559    case kMips64:
560    case kX86:
561    case kX86_64: return true;
562    default: return false;
563  }
564}
565
566static void CompileMethod(Thread* self,
567                          CompilerDriver* driver,
568                          const DexFile::CodeItem* code_item,
569                          uint32_t access_flags,
570                          InvokeType invoke_type,
571                          uint16_t class_def_idx,
572                          uint32_t method_idx,
573                          jobject class_loader,
574                          const DexFile& dex_file,
575                          optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level,
576                          bool compilation_enabled,
577                          Handle<mirror::DexCache> dex_cache)
578    REQUIRES(!driver->compiled_methods_lock_) {
579  DCHECK(driver != nullptr);
580  CompiledMethod* compiled_method = nullptr;
581  uint64_t start_ns = kTimeCompileMethod ? NanoTime() : 0;
582  MethodReference method_ref(&dex_file, method_idx);
583
584  if ((access_flags & kAccNative) != 0) {
585    // Are we interpreting only and have support for generic JNI down calls?
586    if (!driver->GetCompilerOptions().IsCompilationEnabled() &&
587        InstructionSetHasGenericJniStub(driver->GetInstructionSet())) {
588      // Leaving this empty will trigger the generic JNI version
589    } else {
590      compiled_method = driver->GetCompiler()->JniCompile(access_flags, method_idx, dex_file);
591      CHECK(compiled_method != nullptr);
592    }
593  } else if ((access_flags & kAccAbstract) != 0) {
594    // Abstract methods don't have code.
595  } else {
596    const VerifiedMethod* verified_method =
597        driver->GetVerificationResults()->GetVerifiedMethod(method_ref);
598    bool compile = compilation_enabled &&
599        // Basic checks, e.g., not <clinit>.
600        driver->GetVerificationResults()
601            ->IsCandidateForCompilation(method_ref, access_flags) &&
602        // Did not fail to create VerifiedMethod metadata.
603        verified_method != nullptr &&
604        // Do not have failures that should punt to the interpreter.
605        !verified_method->HasRuntimeThrow() &&
606        (verified_method->GetEncounteredVerificationFailures() &
607            (verifier::VERIFY_ERROR_FORCE_INTERPRETER | verifier::VERIFY_ERROR_LOCKING)) == 0 &&
608        // Is eligable for compilation by methods-to-compile filter.
609        driver->IsMethodToCompile(method_ref);
610    if (compile) {
611      // NOTE: if compiler declines to compile this method, it will return null.
612      compiled_method = driver->GetCompiler()->Compile(code_item, access_flags, invoke_type,
613                                                       class_def_idx, method_idx, class_loader,
614                                                       dex_file, dex_cache);
615    }
616    if (compiled_method == nullptr &&
617        dex_to_dex_compilation_level != optimizer::DexToDexCompilationLevel::kDontDexToDexCompile) {
618      // TODO: add a command-line option to disable DEX-to-DEX compilation ?
619      // Do not optimize if a VerifiedMethod is missing. SafeCast elision, for example, relies on
620      // it.
621      compiled_method = optimizer::ArtCompileDEX(
622          driver,
623          code_item,
624          access_flags,
625          invoke_type,
626          class_def_idx,
627          method_idx,
628          class_loader,
629          dex_file,
630          (verified_method != nullptr)
631              ? dex_to_dex_compilation_level
632              : optimizer::DexToDexCompilationLevel::kRequired);
633    }
634  }
635  if (kTimeCompileMethod) {
636    uint64_t duration_ns = NanoTime() - start_ns;
637    if (duration_ns > MsToNs(driver->GetCompiler()->GetMaximumCompilationTimeBeforeWarning())) {
638      LOG(WARNING) << "Compilation of " << PrettyMethod(method_idx, dex_file)
639                   << " took " << PrettyDuration(duration_ns);
640    }
641  }
642
643  if (compiled_method != nullptr) {
644    // Count non-relative linker patches.
645    size_t non_relative_linker_patch_count = 0u;
646    for (const LinkerPatch& patch : compiled_method->GetPatches()) {
647      if (!patch.IsPcRelative()) {
648        ++non_relative_linker_patch_count;
649      }
650    }
651    bool compile_pic = driver->GetCompilerOptions().GetCompilePic();  // Off by default
652    // When compiling with PIC, there should be zero non-relative linker patches
653    CHECK(!compile_pic || non_relative_linker_patch_count == 0u);
654
655    driver->AddCompiledMethod(method_ref, compiled_method, non_relative_linker_patch_count);
656  }
657
658  // Done compiling, delete the verified method to reduce native memory usage. Do not delete in
659  // optimizing compiler, which may need the verified method again for inlining.
660  if (driver->GetCompilerKind() != Compiler::kOptimizing) {
661    driver->GetVerificationResults()->RemoveVerifiedMethod(method_ref);
662  }
663
664  if (self->IsExceptionPending()) {
665    ScopedObjectAccess soa(self);
666    LOG(FATAL) << "Unexpected exception compiling: " << PrettyMethod(method_idx, dex_file) << "\n"
667        << self->GetException()->Dump();
668  }
669}
670
671void CompilerDriver::CompileOne(Thread* self, ArtMethod* method, TimingLogger* timings) {
672  DCHECK(!Runtime::Current()->IsStarted());
673  jobject jclass_loader;
674  const DexFile* dex_file;
675  uint16_t class_def_idx;
676  uint32_t method_idx = method->GetDexMethodIndex();
677  uint32_t access_flags = method->GetAccessFlags();
678  InvokeType invoke_type = method->GetInvokeType();
679  StackHandleScope<1> hs(self);
680  Handle<mirror::DexCache> dex_cache(hs.NewHandle(method->GetDexCache()));
681  {
682    ScopedObjectAccessUnchecked soa(self);
683    ScopedLocalRef<jobject> local_class_loader(
684        soa.Env(), soa.AddLocalReference<jobject>(method->GetDeclaringClass()->GetClassLoader()));
685    jclass_loader = soa.Env()->NewGlobalRef(local_class_loader.get());
686    // Find the dex_file
687    dex_file = method->GetDexFile();
688    class_def_idx = method->GetClassDefIndex();
689  }
690  const DexFile::CodeItem* code_item = dex_file->GetCodeItem(method->GetCodeItemOffset());
691
692  // Go to native so that we don't block GC during compilation.
693  ScopedThreadSuspension sts(self, kNative);
694
695  std::vector<const DexFile*> dex_files;
696  dex_files.push_back(dex_file);
697
698  std::unique_ptr<ThreadPool> thread_pool(new ThreadPool("Compiler driver thread pool", 0U));
699  PreCompile(jclass_loader, dex_files, thread_pool.get(), timings);
700
701  // Can we run DEX-to-DEX compiler on this class ?
702  optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level =
703      GetDexToDexCompilationLevel(self,
704                                  *this,
705                                  jclass_loader,
706                                  *dex_file,
707                                  dex_file->GetClassDef(class_def_idx));
708
709  CompileMethod(self,
710                this,
711                code_item,
712                access_flags,
713                invoke_type,
714                class_def_idx,
715                method_idx,
716                jclass_loader,
717                *dex_file,
718                dex_to_dex_compilation_level,
719                true,
720                dex_cache);
721
722  self->GetJniEnv()->DeleteGlobalRef(jclass_loader);
723}
724
725CompiledMethod* CompilerDriver::CompileArtMethod(Thread* self, ArtMethod* method) {
726  const uint32_t method_idx = method->GetDexMethodIndex();
727  const uint32_t access_flags = method->GetAccessFlags();
728  const InvokeType invoke_type = method->GetInvokeType();
729  StackHandleScope<2> hs(self);
730  Handle<mirror::ClassLoader> class_loader(hs.NewHandle(
731      method->GetDeclaringClass()->GetClassLoader()));
732  Handle<mirror::DexCache> dex_cache(hs.NewHandle(method->GetDexCache()));
733  jobject jclass_loader = class_loader.ToJObject();
734  const DexFile* dex_file = method->GetDexFile();
735  const uint16_t class_def_idx = method->GetClassDefIndex();
736  const DexFile::ClassDef& class_def = dex_file->GetClassDef(class_def_idx);
737  optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level =
738      GetDexToDexCompilationLevel(self, *this, class_loader, *dex_file, class_def);
739  const DexFile::CodeItem* code_item = dex_file->GetCodeItem(method->GetCodeItemOffset());
740  // Go to native so that we don't block GC during compilation.
741  ScopedThreadSuspension sts(self, kNative);
742  CompileMethod(self,
743                this,
744                code_item,
745                access_flags,
746                invoke_type,
747                class_def_idx,
748                method_idx,
749                jclass_loader,
750                *dex_file,
751                dex_to_dex_compilation_level,
752                true,
753                dex_cache);
754  auto* compiled_method = GetCompiledMethod(MethodReference(dex_file, method_idx));
755  return compiled_method;
756}
757
758void CompilerDriver::Resolve(jobject class_loader, const std::vector<const DexFile*>& dex_files,
759                             ThreadPool* thread_pool, TimingLogger* timings) {
760  for (size_t i = 0; i != dex_files.size(); ++i) {
761    const DexFile* dex_file = dex_files[i];
762    CHECK(dex_file != nullptr);
763    ResolveDexFile(class_loader, *dex_file, dex_files, thread_pool, timings);
764  }
765}
766
767void CompilerDriver::PreCompile(jobject class_loader, const std::vector<const DexFile*>& dex_files,
768                                ThreadPool* thread_pool, TimingLogger* timings) {
769  LoadImageClasses(timings);
770  VLOG(compiler) << "LoadImageClasses: " << GetMemoryUsageString(false);
771
772  const bool verification_enabled = compiler_options_->IsVerificationEnabled();
773  const bool never_verify = compiler_options_->NeverVerify();
774
775  // We need to resolve for never_verify since it needs to run dex to dex to add the
776  // RETURN_VOID_NO_BARRIER.
777  if (never_verify || verification_enabled) {
778    Resolve(class_loader, dex_files, thread_pool, timings);
779    VLOG(compiler) << "Resolve: " << GetMemoryUsageString(false);
780  }
781
782  if (never_verify) {
783    VLOG(compiler) << "Verify none mode specified, skipping verification.";
784    SetVerified(class_loader, dex_files, thread_pool, timings);
785  }
786
787  if (!verification_enabled) {
788    return;
789  }
790
791  Verify(class_loader, dex_files, thread_pool, timings);
792  VLOG(compiler) << "Verify: " << GetMemoryUsageString(false);
793
794  if (had_hard_verifier_failure_ && GetCompilerOptions().AbortOnHardVerifierFailure()) {
795    LOG(FATAL) << "Had a hard failure verifying all classes, and was asked to abort in such "
796               << "situations. Please check the log.";
797  }
798
799  InitializeClasses(class_loader, dex_files, thread_pool, timings);
800  VLOG(compiler) << "InitializeClasses: " << GetMemoryUsageString(false);
801
802  UpdateImageClasses(timings);
803  VLOG(compiler) << "UpdateImageClasses: " << GetMemoryUsageString(false);
804}
805
806bool CompilerDriver::IsImageClass(const char* descriptor) const {
807  if (!IsImage()) {
808    // NOTE: Currently unreachable, all callers check IsImage().
809    return false;
810  } else {
811    return image_classes_->find(descriptor) != image_classes_->end();
812  }
813}
814
815bool CompilerDriver::IsClassToCompile(const char* descriptor) const {
816  if (kRestrictCompilationFiltersToImage && !IsImage()) {
817    return true;
818  }
819
820  if (classes_to_compile_ == nullptr) {
821    return true;
822  }
823  return classes_to_compile_->find(descriptor) != classes_to_compile_->end();
824}
825
826bool CompilerDriver::IsMethodToCompile(const MethodReference& method_ref) const {
827  if (kRestrictCompilationFiltersToImage && !IsImage()) {
828    return true;
829  }
830
831  if (methods_to_compile_ == nullptr) {
832    return true;
833  }
834
835  std::string tmp = PrettyMethod(method_ref.dex_method_index, *method_ref.dex_file, true);
836  return methods_to_compile_->find(tmp.c_str()) != methods_to_compile_->end();
837}
838
839class ResolveCatchBlockExceptionsClassVisitor : public ClassVisitor {
840 public:
841  ResolveCatchBlockExceptionsClassVisitor(
842      std::set<std::pair<uint16_t, const DexFile*>>& exceptions_to_resolve)
843     : exceptions_to_resolve_(exceptions_to_resolve) {}
844
845  virtual bool Visit(mirror::Class* c) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) {
846    const auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
847    for (auto& m : c->GetVirtualMethods(pointer_size)) {
848      ResolveExceptionsForMethod(&m, pointer_size);
849    }
850    for (auto& m : c->GetDirectMethods(pointer_size)) {
851      ResolveExceptionsForMethod(&m, pointer_size);
852    }
853    return true;
854  }
855
856 private:
857  void ResolveExceptionsForMethod(ArtMethod* method_handle, size_t pointer_size)
858      SHARED_REQUIRES(Locks::mutator_lock_) {
859    const DexFile::CodeItem* code_item = method_handle->GetCodeItem();
860    if (code_item == nullptr) {
861      return;  // native or abstract method
862    }
863    if (code_item->tries_size_ == 0) {
864      return;  // nothing to process
865    }
866    const uint8_t* encoded_catch_handler_list = DexFile::GetCatchHandlerData(*code_item, 0);
867    size_t num_encoded_catch_handlers = DecodeUnsignedLeb128(&encoded_catch_handler_list);
868    for (size_t i = 0; i < num_encoded_catch_handlers; i++) {
869      int32_t encoded_catch_handler_size = DecodeSignedLeb128(&encoded_catch_handler_list);
870      bool has_catch_all = false;
871      if (encoded_catch_handler_size <= 0) {
872        encoded_catch_handler_size = -encoded_catch_handler_size;
873        has_catch_all = true;
874      }
875      for (int32_t j = 0; j < encoded_catch_handler_size; j++) {
876        uint16_t encoded_catch_handler_handlers_type_idx =
877            DecodeUnsignedLeb128(&encoded_catch_handler_list);
878        // Add to set of types to resolve if not already in the dex cache resolved types
879        if (!method_handle->IsResolvedTypeIdx(encoded_catch_handler_handlers_type_idx,
880                                              pointer_size)) {
881          exceptions_to_resolve_.emplace(encoded_catch_handler_handlers_type_idx,
882                                         method_handle->GetDexFile());
883        }
884        // ignore address associated with catch handler
885        DecodeUnsignedLeb128(&encoded_catch_handler_list);
886      }
887      if (has_catch_all) {
888        // ignore catch all address
889        DecodeUnsignedLeb128(&encoded_catch_handler_list);
890      }
891    }
892  }
893
894  std::set<std::pair<uint16_t, const DexFile*>>& exceptions_to_resolve_;
895};
896
897class RecordImageClassesVisitor : public ClassVisitor {
898 public:
899  explicit RecordImageClassesVisitor(std::unordered_set<std::string>* image_classes)
900      : image_classes_(image_classes) {}
901
902  bool Visit(mirror::Class* klass) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) {
903    std::string temp;
904    image_classes_->insert(klass->GetDescriptor(&temp));
905    return true;
906  }
907
908 private:
909  std::unordered_set<std::string>* const image_classes_;
910};
911
912// Make a list of descriptors for classes to include in the image
913void CompilerDriver::LoadImageClasses(TimingLogger* timings) {
914  CHECK(timings != nullptr);
915  if (!IsImage()) {
916    return;
917  }
918
919  TimingLogger::ScopedTiming t("LoadImageClasses", timings);
920  // Make a first class to load all classes explicitly listed in the file
921  Thread* self = Thread::Current();
922  ScopedObjectAccess soa(self);
923  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
924  CHECK(image_classes_.get() != nullptr);
925  for (auto it = image_classes_->begin(), end = image_classes_->end(); it != end;) {
926    const std::string& descriptor(*it);
927    StackHandleScope<1> hs(self);
928    Handle<mirror::Class> klass(
929        hs.NewHandle(class_linker->FindSystemClass(self, descriptor.c_str())));
930    if (klass.Get() == nullptr) {
931      VLOG(compiler) << "Failed to find class " << descriptor;
932      image_classes_->erase(it++);
933      self->ClearException();
934    } else {
935      ++it;
936    }
937  }
938
939  // Resolve exception classes referenced by the loaded classes. The catch logic assumes
940  // exceptions are resolved by the verifier when there is a catch block in an interested method.
941  // Do this here so that exception classes appear to have been specified image classes.
942  std::set<std::pair<uint16_t, const DexFile*>> unresolved_exception_types;
943  StackHandleScope<1> hs(self);
944  Handle<mirror::Class> java_lang_Throwable(
945      hs.NewHandle(class_linker->FindSystemClass(self, "Ljava/lang/Throwable;")));
946  do {
947    unresolved_exception_types.clear();
948    ResolveCatchBlockExceptionsClassVisitor visitor(unresolved_exception_types);
949    class_linker->VisitClasses(&visitor);
950    for (const std::pair<uint16_t, const DexFile*>& exception_type : unresolved_exception_types) {
951      uint16_t exception_type_idx = exception_type.first;
952      const DexFile* dex_file = exception_type.second;
953      StackHandleScope<2> hs2(self);
954      Handle<mirror::DexCache> dex_cache(hs2.NewHandle(class_linker->RegisterDexFile(*dex_file)));
955      Handle<mirror::Class> klass(hs2.NewHandle(
956          class_linker->ResolveType(*dex_file, exception_type_idx, dex_cache,
957                                    NullHandle<mirror::ClassLoader>())));
958      if (klass.Get() == nullptr) {
959        const DexFile::TypeId& type_id = dex_file->GetTypeId(exception_type_idx);
960        const char* descriptor = dex_file->GetTypeDescriptor(type_id);
961        LOG(FATAL) << "Failed to resolve class " << descriptor;
962      }
963      DCHECK(java_lang_Throwable->IsAssignableFrom(klass.Get()));
964    }
965    // Resolving exceptions may load classes that reference more exceptions, iterate until no
966    // more are found
967  } while (!unresolved_exception_types.empty());
968
969  // We walk the roots looking for classes so that we'll pick up the
970  // above classes plus any classes them depend on such super
971  // classes, interfaces, and the required ClassLinker roots.
972  RecordImageClassesVisitor visitor(image_classes_.get());
973  class_linker->VisitClasses(&visitor);
974
975  CHECK_NE(image_classes_->size(), 0U);
976}
977
978static void MaybeAddToImageClasses(Handle<mirror::Class> c,
979                                   std::unordered_set<std::string>* image_classes)
980    SHARED_REQUIRES(Locks::mutator_lock_) {
981  Thread* self = Thread::Current();
982  StackHandleScope<1> hs(self);
983  // Make a copy of the handle so that we don't clobber it doing Assign.
984  MutableHandle<mirror::Class> klass(hs.NewHandle(c.Get()));
985  std::string temp;
986  const size_t pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
987  while (!klass->IsObjectClass()) {
988    const char* descriptor = klass->GetDescriptor(&temp);
989    std::pair<std::unordered_set<std::string>::iterator, bool> result =
990        image_classes->insert(descriptor);
991    if (!result.second) {  // Previously inserted.
992      break;
993    }
994    VLOG(compiler) << "Adding " << descriptor << " to image classes";
995    for (size_t i = 0; i < klass->NumDirectInterfaces(); ++i) {
996      StackHandleScope<1> hs2(self);
997      MaybeAddToImageClasses(hs2.NewHandle(mirror::Class::GetDirectInterface(self, klass, i)),
998                             image_classes);
999    }
1000    for (auto& m : c->GetVirtualMethods(pointer_size)) {
1001      if (m.IsMiranda() || (true)) {
1002        StackHandleScope<1> hs2(self);
1003        MaybeAddToImageClasses(hs2.NewHandle(m.GetDeclaringClass()), image_classes);
1004      }
1005    }
1006    if (klass->IsArrayClass()) {
1007      StackHandleScope<1> hs2(self);
1008      MaybeAddToImageClasses(hs2.NewHandle(klass->GetComponentType()), image_classes);
1009    }
1010    klass.Assign(klass->GetSuperClass());
1011  }
1012}
1013
1014// Keeps all the data for the update together. Also doubles as the reference visitor.
1015// Note: we can use object pointers because we suspend all threads.
1016class ClinitImageUpdate {
1017 public:
1018  static ClinitImageUpdate* Create(std::unordered_set<std::string>* image_class_descriptors,
1019                                   Thread* self, ClassLinker* linker, std::string* error_msg) {
1020    std::unique_ptr<ClinitImageUpdate> res(new ClinitImageUpdate(image_class_descriptors, self,
1021                                                                 linker));
1022    if (res->dex_cache_class_ == nullptr) {
1023      *error_msg = "Could not find DexCache class.";
1024      return nullptr;
1025    }
1026
1027    return res.release();
1028  }
1029
1030  ~ClinitImageUpdate() {
1031    // Allow others to suspend again.
1032    self_->EndAssertNoThreadSuspension(old_cause_);
1033  }
1034
1035  // Visitor for VisitReferences.
1036  void operator()(mirror::Object* object, MemberOffset field_offset, bool /* is_static */) const
1037      SHARED_REQUIRES(Locks::mutator_lock_) {
1038    mirror::Object* ref = object->GetFieldObject<mirror::Object>(field_offset);
1039    if (ref != nullptr) {
1040      VisitClinitClassesObject(ref);
1041    }
1042  }
1043
1044  // java.lang.Reference visitor for VisitReferences.
1045  void operator()(mirror::Class* klass ATTRIBUTE_UNUSED, mirror::Reference* ref ATTRIBUTE_UNUSED)
1046      const {}
1047
1048  // Ignore class native roots.
1049  void VisitRootIfNonNull(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED)
1050      const {}
1051  void VisitRoot(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED) const {}
1052
1053  void Walk() SHARED_REQUIRES(Locks::mutator_lock_) {
1054    // Use the initial classes as roots for a search.
1055    for (mirror::Class* klass_root : image_classes_) {
1056      VisitClinitClassesObject(klass_root);
1057    }
1058  }
1059
1060 private:
1061  class FindImageClassesVisitor : public ClassVisitor {
1062   public:
1063    explicit FindImageClassesVisitor(ClinitImageUpdate* data) : data_(data) {}
1064
1065    bool Visit(mirror::Class* klass) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) {
1066      std::string temp;
1067      const char* name = klass->GetDescriptor(&temp);
1068      if (data_->image_class_descriptors_->find(name) != data_->image_class_descriptors_->end()) {
1069        data_->image_classes_.push_back(klass);
1070      } else {
1071        // Check whether it is initialized and has a clinit. They must be kept, too.
1072        if (klass->IsInitialized() && klass->FindClassInitializer(
1073            Runtime::Current()->GetClassLinker()->GetImagePointerSize()) != nullptr) {
1074          data_->image_classes_.push_back(klass);
1075        }
1076      }
1077      return true;
1078    }
1079
1080   private:
1081    ClinitImageUpdate* const data_;
1082  };
1083
1084  ClinitImageUpdate(std::unordered_set<std::string>* image_class_descriptors, Thread* self,
1085                    ClassLinker* linker)
1086      SHARED_REQUIRES(Locks::mutator_lock_) :
1087      image_class_descriptors_(image_class_descriptors), self_(self) {
1088    CHECK(linker != nullptr);
1089    CHECK(image_class_descriptors != nullptr);
1090
1091    // Make sure nobody interferes with us.
1092    old_cause_ = self->StartAssertNoThreadSuspension("Boot image closure");
1093
1094    // Find the interesting classes.
1095    dex_cache_class_ = linker->LookupClass(self, "Ljava/lang/DexCache;",
1096        ComputeModifiedUtf8Hash("Ljava/lang/DexCache;"), nullptr);
1097
1098    // Find all the already-marked classes.
1099    WriterMutexLock mu(self, *Locks::heap_bitmap_lock_);
1100    FindImageClassesVisitor visitor(this);
1101    linker->VisitClasses(&visitor);
1102  }
1103
1104  void VisitClinitClassesObject(mirror::Object* object) const
1105      SHARED_REQUIRES(Locks::mutator_lock_) {
1106    DCHECK(object != nullptr);
1107    if (marked_objects_.find(object) != marked_objects_.end()) {
1108      // Already processed.
1109      return;
1110    }
1111
1112    // Mark it.
1113    marked_objects_.insert(object);
1114
1115    if (object->IsClass()) {
1116      // If it is a class, add it.
1117      StackHandleScope<1> hs(self_);
1118      MaybeAddToImageClasses(hs.NewHandle(object->AsClass()), image_class_descriptors_);
1119    } else {
1120      // Else visit the object's class.
1121      VisitClinitClassesObject(object->GetClass());
1122    }
1123
1124    // If it is not a DexCache, visit all references.
1125    mirror::Class* klass = object->GetClass();
1126    if (klass != dex_cache_class_) {
1127      object->VisitReferences(*this, *this);
1128    }
1129  }
1130
1131  mutable std::unordered_set<mirror::Object*> marked_objects_;
1132  std::unordered_set<std::string>* const image_class_descriptors_;
1133  std::vector<mirror::Class*> image_classes_;
1134  const mirror::Class* dex_cache_class_;
1135  Thread* const self_;
1136  const char* old_cause_;
1137
1138  DISALLOW_COPY_AND_ASSIGN(ClinitImageUpdate);
1139};
1140
1141void CompilerDriver::UpdateImageClasses(TimingLogger* timings) {
1142  if (IsImage()) {
1143    TimingLogger::ScopedTiming t("UpdateImageClasses", timings);
1144
1145    Runtime* runtime = Runtime::Current();
1146
1147    // Suspend all threads.
1148    ScopedSuspendAll ssa(__FUNCTION__);
1149
1150    std::string error_msg;
1151    std::unique_ptr<ClinitImageUpdate> update(ClinitImageUpdate::Create(image_classes_.get(),
1152                                                                        Thread::Current(),
1153                                                                        runtime->GetClassLinker(),
1154                                                                        &error_msg));
1155    CHECK(update.get() != nullptr) << error_msg;  // TODO: Soft failure?
1156
1157    // Do the marking.
1158    update->Walk();
1159  }
1160}
1161
1162bool CompilerDriver::CanAssumeClassIsLoaded(mirror::Class* klass) {
1163  Runtime* runtime = Runtime::Current();
1164  if (!runtime->IsAotCompiler()) {
1165    DCHECK(runtime->UseJit());
1166    // Having the klass reference here implies that the klass is already loaded.
1167    return true;
1168  }
1169  if (!IsImage()) {
1170    // Assume loaded only if klass is in the boot image. App classes cannot be assumed
1171    // loaded because we don't even know what class loader will be used to load them.
1172    bool class_in_image = runtime->GetHeap()->FindSpaceFromObject(klass, false)->IsImageSpace();
1173    return class_in_image;
1174  }
1175  std::string temp;
1176  const char* descriptor = klass->GetDescriptor(&temp);
1177  return IsImageClass(descriptor);
1178}
1179
1180bool CompilerDriver::CanAssumeTypeIsPresentInDexCache(const DexFile& dex_file, uint32_t type_idx) {
1181  if (IsImage() &&
1182      IsImageClass(dex_file.StringDataByIdx(dex_file.GetTypeId(type_idx).descriptor_idx_))) {
1183    {
1184      ScopedObjectAccess soa(Thread::Current());
1185      mirror::DexCache* dex_cache = Runtime::Current()->GetClassLinker()->FindDexCache(
1186          soa.Self(), dex_file, false);
1187      mirror::Class* resolved_class = dex_cache->GetResolvedType(type_idx);
1188      if (resolved_class == nullptr) {
1189        // Erroneous class.
1190        stats_->TypeNotInDexCache();
1191        return false;
1192      }
1193    }
1194    stats_->TypeInDexCache();
1195    return true;
1196  } else {
1197    stats_->TypeNotInDexCache();
1198    return false;
1199  }
1200}
1201
1202bool CompilerDriver::CanAssumeStringIsPresentInDexCache(const DexFile& dex_file,
1203                                                        uint32_t string_idx) {
1204  // See also Compiler::ResolveDexFile
1205
1206  bool result = false;
1207  if (IsImage()) {
1208    // We resolve all const-string strings when building for the image.
1209    ScopedObjectAccess soa(Thread::Current());
1210    StackHandleScope<1> hs(soa.Self());
1211    ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
1212    Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
1213        soa.Self(), dex_file, false)));
1214    class_linker->ResolveString(dex_file, string_idx, dex_cache);
1215    result = true;
1216  }
1217  if (result) {
1218    stats_->StringInDexCache();
1219  } else {
1220    stats_->StringNotInDexCache();
1221  }
1222  return result;
1223}
1224
1225bool CompilerDriver::CanAccessTypeWithoutChecks(uint32_t referrer_idx, const DexFile& dex_file,
1226                                                uint32_t type_idx,
1227                                                bool* type_known_final, bool* type_known_abstract,
1228                                                bool* equals_referrers_class) {
1229  if (type_known_final != nullptr) {
1230    *type_known_final = false;
1231  }
1232  if (type_known_abstract != nullptr) {
1233    *type_known_abstract = false;
1234  }
1235  if (equals_referrers_class != nullptr) {
1236    *equals_referrers_class = false;
1237  }
1238  ScopedObjectAccess soa(Thread::Current());
1239  mirror::DexCache* dex_cache = Runtime::Current()->GetClassLinker()->FindDexCache(
1240      soa.Self(), dex_file, false);
1241  // Get type from dex cache assuming it was populated by the verifier
1242  mirror::Class* resolved_class = dex_cache->GetResolvedType(type_idx);
1243  if (resolved_class == nullptr) {
1244    stats_->TypeNeedsAccessCheck();
1245    return false;  // Unknown class needs access checks.
1246  }
1247  const DexFile::MethodId& method_id = dex_file.GetMethodId(referrer_idx);
1248  if (equals_referrers_class != nullptr) {
1249    *equals_referrers_class = (method_id.class_idx_ == type_idx);
1250  }
1251  mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
1252  if (referrer_class == nullptr) {
1253    stats_->TypeNeedsAccessCheck();
1254    return false;  // Incomplete referrer knowledge needs access check.
1255  }
1256  // Perform access check, will return true if access is ok or false if we're going to have to
1257  // check this at runtime (for example for class loaders).
1258  bool result = referrer_class->CanAccess(resolved_class);
1259  if (result) {
1260    stats_->TypeDoesntNeedAccessCheck();
1261    if (type_known_final != nullptr) {
1262      *type_known_final = resolved_class->IsFinal() && !resolved_class->IsArrayClass();
1263    }
1264    if (type_known_abstract != nullptr) {
1265      *type_known_abstract = resolved_class->IsAbstract() && !resolved_class->IsArrayClass();
1266    }
1267  } else {
1268    stats_->TypeNeedsAccessCheck();
1269  }
1270  return result;
1271}
1272
1273bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_idx,
1274                                                            const DexFile& dex_file,
1275                                                            uint32_t type_idx) {
1276  ScopedObjectAccess soa(Thread::Current());
1277  mirror::DexCache* dex_cache = Runtime::Current()->GetClassLinker()->FindDexCache(
1278      soa.Self(), dex_file, false);
1279  // Get type from dex cache assuming it was populated by the verifier.
1280  mirror::Class* resolved_class = dex_cache->GetResolvedType(type_idx);
1281  if (resolved_class == nullptr) {
1282    stats_->TypeNeedsAccessCheck();
1283    return false;  // Unknown class needs access checks.
1284  }
1285  const DexFile::MethodId& method_id = dex_file.GetMethodId(referrer_idx);
1286  mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
1287  if (referrer_class == nullptr) {
1288    stats_->TypeNeedsAccessCheck();
1289    return false;  // Incomplete referrer knowledge needs access check.
1290  }
1291  // Perform access and instantiable checks, will return true if access is ok or false if we're
1292  // going to have to check this at runtime (for example for class loaders).
1293  bool result = referrer_class->CanAccess(resolved_class) && resolved_class->IsInstantiable();
1294  if (result) {
1295    stats_->TypeDoesntNeedAccessCheck();
1296  } else {
1297    stats_->TypeNeedsAccessCheck();
1298  }
1299  return result;
1300}
1301
1302bool CompilerDriver::CanEmbedTypeInCode(const DexFile& dex_file, uint32_t type_idx,
1303                                        bool* is_type_initialized, bool* use_direct_type_ptr,
1304                                        uintptr_t* direct_type_ptr, bool* out_is_finalizable) {
1305  ScopedObjectAccess soa(Thread::Current());
1306  Runtime* runtime = Runtime::Current();
1307  mirror::DexCache* dex_cache = runtime->GetClassLinker()->FindDexCache(
1308      soa.Self(), dex_file, false);
1309  mirror::Class* resolved_class = dex_cache->GetResolvedType(type_idx);
1310  if (resolved_class == nullptr) {
1311    return false;
1312  }
1313  if (GetCompilerOptions().GetCompilePic()) {
1314    // Do not allow a direct class pointer to be used when compiling for position-independent
1315    return false;
1316  }
1317  *out_is_finalizable = resolved_class->IsFinalizable();
1318  gc::Heap* heap = runtime->GetHeap();
1319  const bool compiling_boot = heap->IsCompilingBoot();
1320  const bool support_boot_image_fixup = GetSupportBootImageFixup();
1321  if (compiling_boot) {
1322    // boot -> boot class pointers.
1323    // True if the class is in the image at boot compiling time.
1324    const bool is_image_class = IsImage() && IsImageClass(
1325        dex_file.StringDataByIdx(dex_file.GetTypeId(type_idx).descriptor_idx_));
1326    // True if pc relative load works.
1327    if (is_image_class && support_boot_image_fixup) {
1328      *is_type_initialized = resolved_class->IsInitialized();
1329      *use_direct_type_ptr = false;
1330      *direct_type_ptr = 0;
1331      return true;
1332    } else {
1333      return false;
1334    }
1335  } else if (runtime->UseJit() && !heap->IsMovableObject(resolved_class)) {
1336    *is_type_initialized = resolved_class->IsInitialized();
1337    // If the class may move around, then don't embed it as a direct pointer.
1338    *use_direct_type_ptr = true;
1339    *direct_type_ptr = reinterpret_cast<uintptr_t>(resolved_class);
1340    return true;
1341  } else {
1342    // True if the class is in the image at app compiling time.
1343    const bool class_in_image = heap->FindSpaceFromObject(resolved_class, false)->IsImageSpace();
1344    if (class_in_image && support_boot_image_fixup) {
1345      // boot -> app class pointers.
1346      *is_type_initialized = resolved_class->IsInitialized();
1347      // TODO This is somewhat hacky. We should refactor all of this invoke codepath.
1348      *use_direct_type_ptr = !GetCompilerOptions().GetIncludePatchInformation();
1349      *direct_type_ptr = reinterpret_cast<uintptr_t>(resolved_class);
1350      return true;
1351    } else {
1352      // app -> app class pointers.
1353      // Give up because app does not have an image and class
1354      // isn't created at compile time.  TODO: implement this
1355      // if/when each app gets an image.
1356      return false;
1357    }
1358  }
1359}
1360
1361bool CompilerDriver::CanEmbedReferenceTypeInCode(ClassReference* ref,
1362                                                 bool* use_direct_ptr,
1363                                                 uintptr_t* direct_type_ptr) {
1364  CHECK(ref != nullptr);
1365  CHECK(use_direct_ptr != nullptr);
1366  CHECK(direct_type_ptr != nullptr);
1367
1368  ScopedObjectAccess soa(Thread::Current());
1369  mirror::Class* reference_class = mirror::Reference::GetJavaLangRefReference();
1370  bool is_initialized = false;
1371  bool unused_finalizable;
1372  // Make sure we have a finished Reference class object before attempting to use it.
1373  if (!CanEmbedTypeInCode(*reference_class->GetDexCache()->GetDexFile(),
1374                          reference_class->GetDexTypeIndex(), &is_initialized,
1375                          use_direct_ptr, direct_type_ptr, &unused_finalizable) ||
1376      !is_initialized) {
1377    return false;
1378  }
1379  ref->first = &reference_class->GetDexFile();
1380  ref->second = reference_class->GetDexClassDefIndex();
1381  return true;
1382}
1383
1384uint32_t CompilerDriver::GetReferenceSlowFlagOffset() const {
1385  ScopedObjectAccess soa(Thread::Current());
1386  mirror::Class* klass = mirror::Reference::GetJavaLangRefReference();
1387  DCHECK(klass->IsInitialized());
1388  return klass->GetSlowPathFlagOffset().Uint32Value();
1389}
1390
1391uint32_t CompilerDriver::GetReferenceDisableFlagOffset() const {
1392  ScopedObjectAccess soa(Thread::Current());
1393  mirror::Class* klass = mirror::Reference::GetJavaLangRefReference();
1394  DCHECK(klass->IsInitialized());
1395  return klass->GetDisableIntrinsicFlagOffset().Uint32Value();
1396}
1397
1398DexCacheArraysLayout CompilerDriver::GetDexCacheArraysLayout(const DexFile* dex_file) {
1399  // Currently only image dex caches have fixed array layout.
1400  return IsImage() && GetSupportBootImageFixup()
1401      ? DexCacheArraysLayout(GetInstructionSetPointerSize(instruction_set_), dex_file)
1402      : DexCacheArraysLayout();
1403}
1404
1405void CompilerDriver::ProcessedInstanceField(bool resolved) {
1406  if (!resolved) {
1407    stats_->UnresolvedInstanceField();
1408  } else {
1409    stats_->ResolvedInstanceField();
1410  }
1411}
1412
1413void CompilerDriver::ProcessedStaticField(bool resolved, bool local) {
1414  if (!resolved) {
1415    stats_->UnresolvedStaticField();
1416  } else if (local) {
1417    stats_->ResolvedLocalStaticField();
1418  } else {
1419    stats_->ResolvedStaticField();
1420  }
1421}
1422
1423void CompilerDriver::ProcessedInvoke(InvokeType invoke_type, int flags) {
1424  stats_->ProcessedInvoke(invoke_type, flags);
1425}
1426
1427ArtField* CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx,
1428                                                   const DexCompilationUnit* mUnit, bool is_put,
1429                                                   const ScopedObjectAccess& soa) {
1430  // Try to resolve the field and compiling method's class.
1431  ArtField* resolved_field;
1432  mirror::Class* referrer_class;
1433  Handle<mirror::DexCache> dex_cache(mUnit->GetDexCache());
1434  {
1435    StackHandleScope<1> hs(soa.Self());
1436    Handle<mirror::ClassLoader> class_loader_handle(
1437        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(mUnit->GetClassLoader())));
1438    resolved_field = ResolveField(soa, dex_cache, class_loader_handle, mUnit, field_idx, false);
1439    referrer_class = resolved_field != nullptr
1440        ? ResolveCompilingMethodsClass(soa, dex_cache, class_loader_handle, mUnit) : nullptr;
1441  }
1442  bool can_link = false;
1443  if (resolved_field != nullptr && referrer_class != nullptr) {
1444    std::pair<bool, bool> fast_path = IsFastInstanceField(
1445        dex_cache.Get(), referrer_class, resolved_field, field_idx);
1446    can_link = is_put ? fast_path.second : fast_path.first;
1447  }
1448  ProcessedInstanceField(can_link);
1449  return can_link ? resolved_field : nullptr;
1450}
1451
1452bool CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit,
1453                                              bool is_put, MemberOffset* field_offset,
1454                                              bool* is_volatile) {
1455  ScopedObjectAccess soa(Thread::Current());
1456  ArtField* resolved_field = ComputeInstanceFieldInfo(field_idx, mUnit, is_put, soa);
1457
1458  if (resolved_field == nullptr) {
1459    // Conservative defaults.
1460    *is_volatile = true;
1461    *field_offset = MemberOffset(static_cast<size_t>(-1));
1462    return false;
1463  } else {
1464    *is_volatile = resolved_field->IsVolatile();
1465    *field_offset = resolved_field->GetOffset();
1466    return true;
1467  }
1468}
1469
1470bool CompilerDriver::ComputeStaticFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit,
1471                                            bool is_put, MemberOffset* field_offset,
1472                                            uint32_t* storage_index, bool* is_referrers_class,
1473                                            bool* is_volatile, bool* is_initialized,
1474                                            Primitive::Type* type) {
1475  ScopedObjectAccess soa(Thread::Current());
1476  // Try to resolve the field and compiling method's class.
1477  ArtField* resolved_field;
1478  mirror::Class* referrer_class;
1479  Handle<mirror::DexCache> dex_cache(mUnit->GetDexCache());
1480  {
1481    StackHandleScope<1> hs(soa.Self());
1482    Handle<mirror::ClassLoader> class_loader_handle(
1483        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(mUnit->GetClassLoader())));
1484    resolved_field =
1485        ResolveField(soa, dex_cache, class_loader_handle, mUnit, field_idx, true);
1486    referrer_class = resolved_field != nullptr
1487        ? ResolveCompilingMethodsClass(soa, dex_cache, class_loader_handle, mUnit) : nullptr;
1488  }
1489  bool result = false;
1490  if (resolved_field != nullptr && referrer_class != nullptr) {
1491    *is_volatile = IsFieldVolatile(resolved_field);
1492    std::pair<bool, bool> fast_path = IsFastStaticField(
1493        dex_cache.Get(), referrer_class, resolved_field, field_idx, storage_index);
1494    result = is_put ? fast_path.second : fast_path.first;
1495  }
1496  if (result) {
1497    *field_offset = GetFieldOffset(resolved_field);
1498    *is_referrers_class = IsStaticFieldInReferrerClass(referrer_class, resolved_field);
1499    // *is_referrers_class == true implies no worrying about class initialization.
1500    *is_initialized = (*is_referrers_class) ||
1501        (IsStaticFieldsClassInitialized(referrer_class, resolved_field) &&
1502         CanAssumeTypeIsPresentInDexCache(*mUnit->GetDexFile(), *storage_index));
1503    *type = resolved_field->GetTypeAsPrimitiveType();
1504  } else {
1505    // Conservative defaults.
1506    *is_volatile = true;
1507    *field_offset = MemberOffset(static_cast<size_t>(-1));
1508    *storage_index = -1;
1509    *is_referrers_class = false;
1510    *is_initialized = false;
1511    *type = Primitive::kPrimVoid;
1512  }
1513  ProcessedStaticField(result, *is_referrers_class);
1514  return result;
1515}
1516
1517void CompilerDriver::GetCodeAndMethodForDirectCall(InvokeType* type, InvokeType sharp_type,
1518                                                   bool no_guarantee_of_dex_cache_entry,
1519                                                   const mirror::Class* referrer_class,
1520                                                   ArtMethod* method,
1521                                                   int* stats_flags,
1522                                                   MethodReference* target_method,
1523                                                   uintptr_t* direct_code,
1524                                                   uintptr_t* direct_method) {
1525  // For direct and static methods compute possible direct_code and direct_method values, ie
1526  // an address for the Method* being invoked and an address of the code for that Method*.
1527  // For interface calls compute a value for direct_method that is the interface method being
1528  // invoked, so this can be passed to the out-of-line runtime support code.
1529  *direct_code = 0;
1530  *direct_method = 0;
1531  Runtime* const runtime = Runtime::Current();
1532  gc::Heap* const heap = runtime->GetHeap();
1533  auto* cl = runtime->GetClassLinker();
1534  const auto pointer_size = cl->GetImagePointerSize();
1535  bool use_dex_cache = GetCompilerOptions().GetCompilePic();  // Off by default
1536  const bool compiling_boot = heap->IsCompilingBoot();
1537  // TODO This is somewhat hacky. We should refactor all of this invoke codepath.
1538  const bool force_relocations = (compiling_boot ||
1539                                  GetCompilerOptions().GetIncludePatchInformation());
1540  if (sharp_type != kStatic && sharp_type != kDirect) {
1541    return;
1542  }
1543  // TODO: support patching on all architectures.
1544  use_dex_cache = use_dex_cache || (force_relocations && !support_boot_image_fixup_);
1545  mirror::Class* declaring_class = method->GetDeclaringClass();
1546  bool method_code_in_boot = declaring_class->GetClassLoader() == nullptr;
1547  if (!use_dex_cache) {
1548    if (!method_code_in_boot) {
1549      use_dex_cache = true;
1550    } else {
1551      bool has_clinit_trampoline =
1552          method->IsStatic() && !declaring_class->IsInitialized();
1553      if (has_clinit_trampoline && declaring_class != referrer_class) {
1554        // Ensure we run the clinit trampoline unless we are invoking a static method in the same
1555        // class.
1556        use_dex_cache = true;
1557      }
1558    }
1559  }
1560  if (runtime->UseJit()) {
1561    // If we are the JIT, then don't allow a direct call to the interpreter bridge since this will
1562    // never be updated even after we compile the method.
1563    if (cl->IsQuickToInterpreterBridge(
1564        reinterpret_cast<const void*>(compiler_->GetEntryPointOf(method)))) {
1565      use_dex_cache = true;
1566    }
1567  }
1568  if (method_code_in_boot) {
1569    *stats_flags |= kFlagDirectCallToBoot | kFlagDirectMethodToBoot;
1570  }
1571  if (!use_dex_cache && force_relocations) {
1572    bool is_in_image;
1573    if (IsImage()) {
1574      is_in_image = IsImageClass(method->GetDeclaringClassDescriptor());
1575    } else {
1576      is_in_image = instruction_set_ != kX86 && instruction_set_ != kX86_64 &&
1577                    heap->FindSpaceFromObject(method->GetDeclaringClass(), false)->IsImageSpace() &&
1578                    !cl->IsQuickToInterpreterBridge(
1579                        reinterpret_cast<const void*>(compiler_->GetEntryPointOf(method)));
1580    }
1581    if (!is_in_image) {
1582      // We can only branch directly to Methods that are resolved in the DexCache.
1583      // Otherwise we won't invoke the resolution trampoline.
1584      use_dex_cache = true;
1585    }
1586  }
1587  // The method is defined not within this dex file. We need a dex cache slot within the current
1588  // dex file or direct pointers.
1589  bool must_use_direct_pointers = false;
1590  mirror::DexCache* dex_cache = declaring_class->GetDexCache();
1591  if (target_method->dex_file == dex_cache->GetDexFile() &&
1592    !(runtime->UseJit() && dex_cache->GetResolvedMethod(
1593        method->GetDexMethodIndex(), pointer_size) == nullptr)) {
1594    target_method->dex_method_index = method->GetDexMethodIndex();
1595  } else {
1596    if (no_guarantee_of_dex_cache_entry) {
1597      // See if the method is also declared in this dex cache.
1598      uint32_t dex_method_idx = method->FindDexMethodIndexInOtherDexFile(
1599          *target_method->dex_file, target_method->dex_method_index);
1600      if (dex_method_idx != DexFile::kDexNoIndex) {
1601        target_method->dex_method_index = dex_method_idx;
1602      } else {
1603        if (force_relocations && !use_dex_cache) {
1604          target_method->dex_method_index = method->GetDexMethodIndex();
1605          target_method->dex_file = dex_cache->GetDexFile();
1606        }
1607        must_use_direct_pointers = true;
1608      }
1609    }
1610  }
1611  if (use_dex_cache) {
1612    if (must_use_direct_pointers) {
1613      // Fail. Test above showed the only safe dispatch was via the dex cache, however, the direct
1614      // pointers are required as the dex cache lacks an appropriate entry.
1615      VLOG(compiler) << "Dex cache devirtualization failed for: " << PrettyMethod(method);
1616    } else {
1617      *type = sharp_type;
1618    }
1619  } else {
1620    auto* image_space = heap->GetImageSpace();
1621    bool method_in_image = false;
1622    if (image_space != nullptr) {
1623      const auto& method_section = image_space->GetImageHeader().GetMethodsSection();
1624      method_in_image = method_section.Contains(
1625          reinterpret_cast<uint8_t*>(method) - image_space->Begin());
1626    }
1627    if (method_in_image || compiling_boot || runtime->UseJit()) {
1628      // We know we must be able to get to the method in the image, so use that pointer.
1629      // In the case where we are the JIT, we can always use direct pointers since we know where
1630      // the method and its code are / will be. We don't sharpen to interpreter bridge since we
1631      // check IsQuickToInterpreterBridge above.
1632      CHECK(!method->IsAbstract());
1633      *type = sharp_type;
1634      *direct_method = force_relocations ? -1 : reinterpret_cast<uintptr_t>(method);
1635      *direct_code = force_relocations ? -1 : compiler_->GetEntryPointOf(method);
1636      target_method->dex_file = method->GetDeclaringClass()->GetDexCache()->GetDexFile();
1637      target_method->dex_method_index = method->GetDexMethodIndex();
1638    } else if (!must_use_direct_pointers) {
1639      // Set the code and rely on the dex cache for the method.
1640      *type = sharp_type;
1641      if (force_relocations) {
1642        *direct_code = -1;
1643        target_method->dex_file = method->GetDeclaringClass()->GetDexCache()->GetDexFile();
1644        target_method->dex_method_index = method->GetDexMethodIndex();
1645      } else {
1646        *direct_code = compiler_->GetEntryPointOf(method);
1647      }
1648    } else {
1649      // Direct pointers were required but none were available.
1650      VLOG(compiler) << "Dex cache devirtualization failed for: " << PrettyMethod(method);
1651    }
1652  }
1653}
1654
1655bool CompilerDriver::ComputeInvokeInfo(const DexCompilationUnit* mUnit, const uint32_t dex_pc,
1656                                       bool update_stats, bool enable_devirtualization,
1657                                       InvokeType* invoke_type, MethodReference* target_method,
1658                                       int* vtable_idx, uintptr_t* direct_code,
1659                                       uintptr_t* direct_method) {
1660  InvokeType orig_invoke_type = *invoke_type;
1661  int stats_flags = 0;
1662  ScopedObjectAccess soa(Thread::Current());
1663  // Try to resolve the method and compiling method's class.
1664  StackHandleScope<2> hs(soa.Self());
1665  Handle<mirror::DexCache> dex_cache(mUnit->GetDexCache());
1666  Handle<mirror::ClassLoader> class_loader(hs.NewHandle(
1667      soa.Decode<mirror::ClassLoader*>(mUnit->GetClassLoader())));
1668  uint32_t method_idx = target_method->dex_method_index;
1669  ArtMethod* resolved_method = ResolveMethod(
1670      soa, dex_cache, class_loader, mUnit, method_idx, orig_invoke_type);
1671  auto h_referrer_class = hs.NewHandle(resolved_method != nullptr ?
1672      ResolveCompilingMethodsClass(soa, dex_cache, class_loader, mUnit) : nullptr);
1673  bool result = false;
1674  if (resolved_method != nullptr) {
1675    *vtable_idx = GetResolvedMethodVTableIndex(resolved_method, orig_invoke_type);
1676
1677    if (enable_devirtualization && mUnit->GetVerifiedMethod() != nullptr) {
1678      const MethodReference* devirt_target = mUnit->GetVerifiedMethod()->GetDevirtTarget(dex_pc);
1679
1680      stats_flags = IsFastInvoke(
1681          soa, dex_cache, class_loader, mUnit, h_referrer_class.Get(), resolved_method,
1682          invoke_type, target_method, devirt_target, direct_code, direct_method);
1683      result = stats_flags != 0;
1684    } else {
1685      // Devirtualization not enabled. Inline IsFastInvoke(), dropping the devirtualization parts.
1686      if (UNLIKELY(h_referrer_class.Get() == nullptr) ||
1687          UNLIKELY(!h_referrer_class->CanAccessResolvedMethod(resolved_method->GetDeclaringClass(),
1688                                                            resolved_method, dex_cache.Get(),
1689                                                            target_method->dex_method_index)) ||
1690          *invoke_type == kSuper) {
1691        // Slow path. (Without devirtualization, all super calls go slow path as well.)
1692      } else {
1693        // Sharpening failed so generate a regular resolved method dispatch.
1694        stats_flags = kFlagMethodResolved;
1695        GetCodeAndMethodForDirectCall(
1696            invoke_type, *invoke_type, false, h_referrer_class.Get(), resolved_method, &stats_flags,
1697            target_method, direct_code, direct_method);
1698        result = true;
1699      }
1700    }
1701  }
1702  if (!result) {
1703    // Conservative defaults.
1704    *vtable_idx = -1;
1705    *direct_code = 0u;
1706    *direct_method = 0u;
1707  }
1708  if (update_stats) {
1709    ProcessedInvoke(orig_invoke_type, stats_flags);
1710  }
1711  return result;
1712}
1713
1714const VerifiedMethod* CompilerDriver::GetVerifiedMethod(const DexFile* dex_file,
1715                                                        uint32_t method_idx) const {
1716  MethodReference ref(dex_file, method_idx);
1717  return verification_results_->GetVerifiedMethod(ref);
1718}
1719
1720bool CompilerDriver::IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc) {
1721  if (!compiler_options_->IsVerificationEnabled()) {
1722    // If we didn't verify, every cast has to be treated as non-safe.
1723    return false;
1724  }
1725  DCHECK(mUnit->GetVerifiedMethod() != nullptr);
1726  bool result = mUnit->GetVerifiedMethod()->IsSafeCast(dex_pc);
1727  if (result) {
1728    stats_->SafeCast();
1729  } else {
1730    stats_->NotASafeCast();
1731  }
1732  return result;
1733}
1734
1735class CompilationVisitor {
1736 public:
1737  virtual ~CompilationVisitor() {}
1738  virtual void Visit(size_t index) = 0;
1739};
1740
1741class ParallelCompilationManager {
1742 public:
1743  ParallelCompilationManager(ClassLinker* class_linker,
1744                             jobject class_loader,
1745                             CompilerDriver* compiler,
1746                             const DexFile* dex_file,
1747                             const std::vector<const DexFile*>& dex_files,
1748                             ThreadPool* thread_pool)
1749    : index_(0),
1750      class_linker_(class_linker),
1751      class_loader_(class_loader),
1752      compiler_(compiler),
1753      dex_file_(dex_file),
1754      dex_files_(dex_files),
1755      thread_pool_(thread_pool) {}
1756
1757  ClassLinker* GetClassLinker() const {
1758    CHECK(class_linker_ != nullptr);
1759    return class_linker_;
1760  }
1761
1762  jobject GetClassLoader() const {
1763    return class_loader_;
1764  }
1765
1766  CompilerDriver* GetCompiler() const {
1767    CHECK(compiler_ != nullptr);
1768    return compiler_;
1769  }
1770
1771  const DexFile* GetDexFile() const {
1772    CHECK(dex_file_ != nullptr);
1773    return dex_file_;
1774  }
1775
1776  const std::vector<const DexFile*>& GetDexFiles() const {
1777    return dex_files_;
1778  }
1779
1780  void ForAll(size_t begin, size_t end, CompilationVisitor* visitor, size_t work_units)
1781      REQUIRES(!*Locks::mutator_lock_) {
1782    Thread* self = Thread::Current();
1783    self->AssertNoPendingException();
1784    CHECK_GT(work_units, 0U);
1785
1786    index_.StoreRelaxed(begin);
1787    for (size_t i = 0; i < work_units; ++i) {
1788      thread_pool_->AddTask(self, new ForAllClosure(this, end, visitor));
1789    }
1790    thread_pool_->StartWorkers(self);
1791
1792    // Ensure we're suspended while we're blocked waiting for the other threads to finish (worker
1793    // thread destructor's called below perform join).
1794    CHECK_NE(self->GetState(), kRunnable);
1795
1796    // Wait for all the worker threads to finish.
1797    thread_pool_->Wait(self, true, false);
1798  }
1799
1800  size_t NextIndex() {
1801    return index_.FetchAndAddSequentiallyConsistent(1);
1802  }
1803
1804 private:
1805  class ForAllClosure : public Task {
1806   public:
1807    ForAllClosure(ParallelCompilationManager* manager, size_t end, CompilationVisitor* visitor)
1808        : manager_(manager),
1809          end_(end),
1810          visitor_(visitor) {}
1811
1812    virtual void Run(Thread* self) {
1813      while (true) {
1814        const size_t index = manager_->NextIndex();
1815        if (UNLIKELY(index >= end_)) {
1816          break;
1817        }
1818        visitor_->Visit(index);
1819        self->AssertNoPendingException();
1820      }
1821    }
1822
1823    virtual void Finalize() {
1824      delete this;
1825    }
1826
1827   private:
1828    ParallelCompilationManager* const manager_;
1829    const size_t end_;
1830    CompilationVisitor* const visitor_;
1831  };
1832
1833  AtomicInteger index_;
1834  ClassLinker* const class_linker_;
1835  const jobject class_loader_;
1836  CompilerDriver* const compiler_;
1837  const DexFile* const dex_file_;
1838  const std::vector<const DexFile*>& dex_files_;
1839  ThreadPool* const thread_pool_;
1840
1841  DISALLOW_COPY_AND_ASSIGN(ParallelCompilationManager);
1842};
1843
1844// A fast version of SkipClass above if the class pointer is available
1845// that avoids the expensive FindInClassPath search.
1846static bool SkipClass(jobject class_loader, const DexFile& dex_file, mirror::Class* klass)
1847    SHARED_REQUIRES(Locks::mutator_lock_) {
1848  DCHECK(klass != nullptr);
1849  const DexFile& original_dex_file = *klass->GetDexCache()->GetDexFile();
1850  if (&dex_file != &original_dex_file) {
1851    if (class_loader == nullptr) {
1852      LOG(WARNING) << "Skipping class " << PrettyDescriptor(klass) << " from "
1853                   << dex_file.GetLocation() << " previously found in "
1854                   << original_dex_file.GetLocation();
1855    }
1856    return true;
1857  }
1858  return false;
1859}
1860
1861static void CheckAndClearResolveException(Thread* self)
1862    SHARED_REQUIRES(Locks::mutator_lock_) {
1863  CHECK(self->IsExceptionPending());
1864  mirror::Throwable* exception = self->GetException();
1865  std::string temp;
1866  const char* descriptor = exception->GetClass()->GetDescriptor(&temp);
1867  const char* expected_exceptions[] = {
1868      "Ljava/lang/IllegalAccessError;",
1869      "Ljava/lang/IncompatibleClassChangeError;",
1870      "Ljava/lang/InstantiationError;",
1871      "Ljava/lang/LinkageError;",
1872      "Ljava/lang/NoClassDefFoundError;",
1873      "Ljava/lang/NoSuchFieldError;",
1874      "Ljava/lang/NoSuchMethodError;"
1875  };
1876  bool found = false;
1877  for (size_t i = 0; (found == false) && (i < arraysize(expected_exceptions)); ++i) {
1878    if (strcmp(descriptor, expected_exceptions[i]) == 0) {
1879      found = true;
1880    }
1881  }
1882  if (!found) {
1883    LOG(FATAL) << "Unexpected exception " << exception->Dump();
1884  }
1885  self->ClearException();
1886}
1887
1888class ResolveClassFieldsAndMethodsVisitor : public CompilationVisitor {
1889 public:
1890  explicit ResolveClassFieldsAndMethodsVisitor(const ParallelCompilationManager* manager)
1891      : manager_(manager) {}
1892
1893  void Visit(size_t class_def_index) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
1894    ATRACE_CALL();
1895    Thread* const self = Thread::Current();
1896    jobject jclass_loader = manager_->GetClassLoader();
1897    const DexFile& dex_file = *manager_->GetDexFile();
1898    ClassLinker* class_linker = manager_->GetClassLinker();
1899
1900    // If an instance field is final then we need to have a barrier on the return, static final
1901    // fields are assigned within the lock held for class initialization. Conservatively assume
1902    // constructor barriers are always required.
1903    bool requires_constructor_barrier = true;
1904
1905    // Method and Field are the worst. We can't resolve without either
1906    // context from the code use (to disambiguate virtual vs direct
1907    // method and instance vs static field) or from class
1908    // definitions. While the compiler will resolve what it can as it
1909    // needs it, here we try to resolve fields and methods used in class
1910    // definitions, since many of them many never be referenced by
1911    // generated code.
1912    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
1913    ScopedObjectAccess soa(self);
1914    StackHandleScope<2> hs(soa.Self());
1915    Handle<mirror::ClassLoader> class_loader(
1916        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
1917    Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
1918        soa.Self(), dex_file, false)));
1919    // Resolve the class.
1920    mirror::Class* klass = class_linker->ResolveType(dex_file, class_def.class_idx_, dex_cache,
1921                                                     class_loader);
1922    bool resolve_fields_and_methods;
1923    if (klass == nullptr) {
1924      // Class couldn't be resolved, for example, super-class is in a different dex file. Don't
1925      // attempt to resolve methods and fields when there is no declaring class.
1926      CheckAndClearResolveException(soa.Self());
1927      resolve_fields_and_methods = false;
1928    } else {
1929      // We successfully resolved a class, should we skip it?
1930      if (SkipClass(jclass_loader, dex_file, klass)) {
1931        return;
1932      }
1933      // We want to resolve the methods and fields eagerly.
1934      resolve_fields_and_methods = true;
1935    }
1936    // Note the class_data pointer advances through the headers,
1937    // static fields, instance fields, direct methods, and virtual
1938    // methods.
1939    const uint8_t* class_data = dex_file.GetClassData(class_def);
1940    if (class_data == nullptr) {
1941      // Empty class such as a marker interface.
1942      requires_constructor_barrier = false;
1943    } else {
1944      ClassDataItemIterator it(dex_file, class_data);
1945      while (it.HasNextStaticField()) {
1946        if (resolve_fields_and_methods) {
1947          ArtField* field = class_linker->ResolveField(dex_file, it.GetMemberIndex(),
1948                                                               dex_cache, class_loader, true);
1949          if (field == nullptr) {
1950            CheckAndClearResolveException(soa.Self());
1951          }
1952        }
1953        it.Next();
1954      }
1955      // We require a constructor barrier if there are final instance fields.
1956      requires_constructor_barrier = false;
1957      while (it.HasNextInstanceField()) {
1958        if (it.MemberIsFinal()) {
1959          requires_constructor_barrier = true;
1960        }
1961        if (resolve_fields_and_methods) {
1962          ArtField* field = class_linker->ResolveField(dex_file, it.GetMemberIndex(),
1963                                                               dex_cache, class_loader, false);
1964          if (field == nullptr) {
1965            CheckAndClearResolveException(soa.Self());
1966          }
1967        }
1968        it.Next();
1969      }
1970      if (resolve_fields_and_methods) {
1971        while (it.HasNextDirectMethod()) {
1972          ArtMethod* method = class_linker->ResolveMethod(
1973              dex_file, it.GetMemberIndex(), dex_cache, class_loader, nullptr,
1974              it.GetMethodInvokeType(class_def));
1975          if (method == nullptr) {
1976            CheckAndClearResolveException(soa.Self());
1977          }
1978          it.Next();
1979        }
1980        while (it.HasNextVirtualMethod()) {
1981          ArtMethod* method = class_linker->ResolveMethod(
1982              dex_file, it.GetMemberIndex(), dex_cache, class_loader, nullptr,
1983              it.GetMethodInvokeType(class_def));
1984          if (method == nullptr) {
1985            CheckAndClearResolveException(soa.Self());
1986          }
1987          it.Next();
1988        }
1989        DCHECK(!it.HasNext());
1990      }
1991    }
1992    if (requires_constructor_barrier) {
1993      manager_->GetCompiler()->AddRequiresConstructorBarrier(self, &dex_file, class_def_index);
1994    }
1995  }
1996
1997 private:
1998  const ParallelCompilationManager* const manager_;
1999};
2000
2001class ResolveTypeVisitor : public CompilationVisitor {
2002 public:
2003  explicit ResolveTypeVisitor(const ParallelCompilationManager* manager) : manager_(manager) {
2004  }
2005  virtual void Visit(size_t type_idx) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
2006  // Class derived values are more complicated, they require the linker and loader.
2007    ScopedObjectAccess soa(Thread::Current());
2008    ClassLinker* class_linker = manager_->GetClassLinker();
2009    const DexFile& dex_file = *manager_->GetDexFile();
2010    StackHandleScope<2> hs(soa.Self());
2011    Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->RegisterDexFile(dex_file)));
2012    Handle<mirror::ClassLoader> class_loader(
2013        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(manager_->GetClassLoader())));
2014    mirror::Class* klass = class_linker->ResolveType(dex_file, type_idx, dex_cache, class_loader);
2015
2016    if (klass == nullptr) {
2017      soa.Self()->AssertPendingException();
2018      mirror::Throwable* exception = soa.Self()->GetException();
2019      VLOG(compiler) << "Exception during type resolution: " << exception->Dump();
2020      if (exception->GetClass()->DescriptorEquals("Ljava/lang/OutOfMemoryError;")) {
2021        // There's little point continuing compilation if the heap is exhausted.
2022        LOG(FATAL) << "Out of memory during type resolution for compilation";
2023      }
2024      soa.Self()->ClearException();
2025    }
2026  }
2027
2028 private:
2029  const ParallelCompilationManager* const manager_;
2030};
2031
2032void CompilerDriver::ResolveDexFile(jobject class_loader, const DexFile& dex_file,
2033                                    const std::vector<const DexFile*>& dex_files,
2034                                    ThreadPool* thread_pool, TimingLogger* timings) {
2035  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2036
2037  // TODO: we could resolve strings here, although the string table is largely filled with class
2038  //       and method names.
2039
2040  ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2041                                     thread_pool);
2042  if (IsImage()) {
2043    // For images we resolve all types, such as array, whereas for applications just those with
2044    // classdefs are resolved by ResolveClassFieldsAndMethods.
2045    TimingLogger::ScopedTiming t("Resolve Types", timings);
2046    ResolveTypeVisitor visitor(&context);
2047    context.ForAll(0, dex_file.NumTypeIds(), &visitor, thread_count_);
2048  }
2049
2050  TimingLogger::ScopedTiming t("Resolve MethodsAndFields", timings);
2051  ResolveClassFieldsAndMethodsVisitor visitor(&context);
2052  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count_);
2053}
2054
2055void CompilerDriver::SetVerified(jobject class_loader, const std::vector<const DexFile*>& dex_files,
2056                                 ThreadPool* thread_pool, TimingLogger* timings) {
2057  for (const DexFile* dex_file : dex_files) {
2058    CHECK(dex_file != nullptr);
2059    SetVerifiedDexFile(class_loader, *dex_file, dex_files, thread_pool, timings);
2060  }
2061}
2062
2063void CompilerDriver::Verify(jobject class_loader, const std::vector<const DexFile*>& dex_files,
2064                            ThreadPool* thread_pool, TimingLogger* timings) {
2065  for (const DexFile* dex_file : dex_files) {
2066    CHECK(dex_file != nullptr);
2067    VerifyDexFile(class_loader, *dex_file, dex_files, thread_pool, timings);
2068  }
2069}
2070
2071class VerifyClassVisitor : public CompilationVisitor {
2072 public:
2073  explicit VerifyClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2074
2075  virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2076    ATRACE_CALL();
2077    ScopedObjectAccess soa(Thread::Current());
2078    const DexFile& dex_file = *manager_->GetDexFile();
2079    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2080    const char* descriptor = dex_file.GetClassDescriptor(class_def);
2081    ClassLinker* class_linker = manager_->GetClassLinker();
2082    jobject jclass_loader = manager_->GetClassLoader();
2083    StackHandleScope<3> hs(soa.Self());
2084    Handle<mirror::ClassLoader> class_loader(
2085        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
2086    Handle<mirror::Class> klass(
2087        hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2088    if (klass.Get() == nullptr) {
2089      CHECK(soa.Self()->IsExceptionPending());
2090      soa.Self()->ClearException();
2091
2092      /*
2093       * At compile time, we can still structurally verify the class even if FindClass fails.
2094       * This is to ensure the class is structurally sound for compilation. An unsound class
2095       * will be rejected by the verifier and later skipped during compilation in the compiler.
2096       */
2097      Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
2098          soa.Self(), dex_file, false)));
2099      std::string error_msg;
2100      if (verifier::MethodVerifier::VerifyClass(soa.Self(), &dex_file, dex_cache, class_loader,
2101                                                &class_def, true, &error_msg) ==
2102                                                    verifier::MethodVerifier::kHardFailure) {
2103        LOG(ERROR) << "Verification failed on class " << PrettyDescriptor(descriptor)
2104                   << " because: " << error_msg;
2105        manager_->GetCompiler()->SetHadHardVerifierFailure();
2106      }
2107    } else if (!SkipClass(jclass_loader, dex_file, klass.Get())) {
2108      CHECK(klass->IsResolved()) << PrettyClass(klass.Get());
2109      class_linker->VerifyClass(soa.Self(), klass);
2110
2111      if (klass->IsErroneous()) {
2112        // ClassLinker::VerifyClass throws, which isn't useful in the compiler.
2113        CHECK(soa.Self()->IsExceptionPending());
2114        soa.Self()->ClearException();
2115        manager_->GetCompiler()->SetHadHardVerifierFailure();
2116      }
2117
2118      CHECK(klass->IsCompileTimeVerified() || klass->IsErroneous())
2119          << PrettyDescriptor(klass.Get()) << ": state=" << klass->GetStatus();
2120
2121      // It is *very* problematic if there are verification errors in the boot classpath. For example,
2122      // we rely on things working OK without verification when the decryption dialog is brought up.
2123      // So abort in a debug build if we find this violated.
2124      DCHECK(!manager_->GetCompiler()->IsImage() || klass->IsVerified()) << "Boot classpath class "
2125          << PrettyClass(klass.Get()) << " failed to fully verify.";
2126    }
2127    soa.Self()->AssertNoPendingException();
2128  }
2129
2130 private:
2131  const ParallelCompilationManager* const manager_;
2132};
2133
2134void CompilerDriver::VerifyDexFile(jobject class_loader, const DexFile& dex_file,
2135                                   const std::vector<const DexFile*>& dex_files,
2136                                   ThreadPool* thread_pool, TimingLogger* timings) {
2137  TimingLogger::ScopedTiming t("Verify Dex File", timings);
2138  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2139  ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2140                                     thread_pool);
2141  VerifyClassVisitor visitor(&context);
2142  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count_);
2143}
2144
2145class SetVerifiedClassVisitor : public CompilationVisitor {
2146 public:
2147  explicit SetVerifiedClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2148
2149  virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2150    ATRACE_CALL();
2151    ScopedObjectAccess soa(Thread::Current());
2152    const DexFile& dex_file = *manager_->GetDexFile();
2153    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2154    const char* descriptor = dex_file.GetClassDescriptor(class_def);
2155    ClassLinker* class_linker = manager_->GetClassLinker();
2156    jobject jclass_loader = manager_->GetClassLoader();
2157    StackHandleScope<3> hs(soa.Self());
2158    Handle<mirror::ClassLoader> class_loader(
2159        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
2160    Handle<mirror::Class> klass(
2161        hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2162    // Class might have failed resolution. Then don't set it to verified.
2163    if (klass.Get() != nullptr) {
2164      // Only do this if the class is resolved. If even resolution fails, quickening will go very,
2165      // very wrong.
2166      if (klass->IsResolved()) {
2167        if (klass->GetStatus() < mirror::Class::kStatusVerified) {
2168          ObjectLock<mirror::Class> lock(soa.Self(), klass);
2169          // Set class status to verified.
2170          mirror::Class::SetStatus(klass, mirror::Class::kStatusVerified, soa.Self());
2171          // Mark methods as pre-verified. If we don't do this, the interpreter will run with
2172          // access checks.
2173          klass->SetPreverifiedFlagOnAllMethods(
2174              GetInstructionSetPointerSize(manager_->GetCompiler()->GetInstructionSet()));
2175          klass->SetPreverified();
2176        }
2177        // Record the final class status if necessary.
2178        ClassReference ref(manager_->GetDexFile(), class_def_index);
2179        manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
2180      }
2181    } else {
2182      Thread* self = soa.Self();
2183      DCHECK(self->IsExceptionPending());
2184      self->ClearException();
2185    }
2186  }
2187
2188 private:
2189  const ParallelCompilationManager* const manager_;
2190};
2191
2192void CompilerDriver::SetVerifiedDexFile(jobject class_loader, const DexFile& dex_file,
2193                                        const std::vector<const DexFile*>& dex_files,
2194                                        ThreadPool* thread_pool, TimingLogger* timings) {
2195  TimingLogger::ScopedTiming t("Verify Dex File", timings);
2196  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2197  ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2198                                     thread_pool);
2199  SetVerifiedClassVisitor visitor(&context);
2200  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count_);
2201}
2202
2203class InitializeClassVisitor : public CompilationVisitor {
2204 public:
2205  explicit InitializeClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2206
2207  virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2208    ATRACE_CALL();
2209    jobject jclass_loader = manager_->GetClassLoader();
2210    const DexFile& dex_file = *manager_->GetDexFile();
2211    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2212    const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def.class_idx_);
2213    const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
2214
2215    ScopedObjectAccess soa(Thread::Current());
2216    StackHandleScope<3> hs(soa.Self());
2217    Handle<mirror::ClassLoader> class_loader(
2218        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
2219    Handle<mirror::Class> klass(
2220        hs.NewHandle(manager_->GetClassLinker()->FindClass(soa.Self(), descriptor, class_loader)));
2221
2222    if (klass.Get() != nullptr && !SkipClass(jclass_loader, dex_file, klass.Get())) {
2223      // Only try to initialize classes that were successfully verified.
2224      if (klass->IsVerified()) {
2225        // Attempt to initialize the class but bail if we either need to initialize the super-class
2226        // or static fields.
2227        manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, false);
2228        if (!klass->IsInitialized()) {
2229          // We don't want non-trivial class initialization occurring on multiple threads due to
2230          // deadlock problems. For example, a parent class is initialized (holding its lock) that
2231          // refers to a sub-class in its static/class initializer causing it to try to acquire the
2232          // sub-class' lock. While on a second thread the sub-class is initialized (holding its lock)
2233          // after first initializing its parents, whose locks are acquired. This leads to a
2234          // parent-to-child and a child-to-parent lock ordering and consequent potential deadlock.
2235          // We need to use an ObjectLock due to potential suspension in the interpreting code. Rather
2236          // than use a special Object for the purpose we use the Class of java.lang.Class.
2237          Handle<mirror::Class> h_klass(hs.NewHandle(klass->GetClass()));
2238          ObjectLock<mirror::Class> lock(soa.Self(), h_klass);
2239          // Attempt to initialize allowing initialization of parent classes but still not static
2240          // fields.
2241          manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, true);
2242          if (!klass->IsInitialized()) {
2243            // We need to initialize static fields, we only do this for image classes that aren't
2244            // marked with the $NoPreloadHolder (which implies this should not be initialized early).
2245            bool can_init_static_fields = manager_->GetCompiler()->IsImage() &&
2246                manager_->GetCompiler()->IsImageClass(descriptor) &&
2247                !StringPiece(descriptor).ends_with("$NoPreloadHolder;");
2248            if (can_init_static_fields) {
2249              VLOG(compiler) << "Initializing: " << descriptor;
2250              // TODO multithreading support. We should ensure the current compilation thread has
2251              // exclusive access to the runtime and the transaction. To achieve this, we could use
2252              // a ReaderWriterMutex but we're holding the mutator lock so we fail mutex sanity
2253              // checks in Thread::AssertThreadSuspensionIsAllowable.
2254              Runtime* const runtime = Runtime::Current();
2255              Transaction transaction;
2256
2257              // Run the class initializer in transaction mode.
2258              runtime->EnterTransactionMode(&transaction);
2259              const mirror::Class::Status old_status = klass->GetStatus();
2260              bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true,
2261                                                                           true);
2262              // TODO we detach transaction from runtime to indicate we quit the transactional
2263              // mode which prevents the GC from visiting objects modified during the transaction.
2264              // Ensure GC is not run so don't access freed objects when aborting transaction.
2265
2266              ScopedAssertNoThreadSuspension ants(soa.Self(), "Transaction end");
2267              runtime->ExitTransactionMode();
2268
2269              if (!success) {
2270                CHECK(soa.Self()->IsExceptionPending());
2271                mirror::Throwable* exception = soa.Self()->GetException();
2272                VLOG(compiler) << "Initialization of " << descriptor << " aborted because of "
2273                    << exception->Dump();
2274                std::ostream* file_log = manager_->GetCompiler()->
2275                    GetCompilerOptions().GetInitFailureOutput();
2276                if (file_log != nullptr) {
2277                  *file_log << descriptor << "\n";
2278                  *file_log << exception->Dump() << "\n";
2279                }
2280                soa.Self()->ClearException();
2281                transaction.Rollback();
2282                CHECK_EQ(old_status, klass->GetStatus()) << "Previous class status not restored";
2283              }
2284            }
2285          }
2286          soa.Self()->AssertNoPendingException();
2287        }
2288      }
2289      // Record the final class status if necessary.
2290      ClassReference ref(manager_->GetDexFile(), class_def_index);
2291      manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
2292    }
2293    // Clear any class not found or verification exceptions.
2294    soa.Self()->ClearException();
2295  }
2296
2297 private:
2298  const ParallelCompilationManager* const manager_;
2299};
2300
2301void CompilerDriver::InitializeClasses(jobject jni_class_loader, const DexFile& dex_file,
2302                                       const std::vector<const DexFile*>& dex_files,
2303                                       ThreadPool* thread_pool, TimingLogger* timings) {
2304  TimingLogger::ScopedTiming t("InitializeNoClinit", timings);
2305  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2306  ParallelCompilationManager context(class_linker, jni_class_loader, this, &dex_file, dex_files,
2307                                     thread_pool);
2308  size_t thread_count;
2309  if (IsImage()) {
2310    // TODO: remove this when transactional mode supports multithreading.
2311    thread_count = 1U;
2312  } else {
2313    thread_count = thread_count_;
2314  }
2315  InitializeClassVisitor visitor(&context);
2316  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
2317}
2318
2319void CompilerDriver::InitializeClasses(jobject class_loader,
2320                                       const std::vector<const DexFile*>& dex_files,
2321                                       ThreadPool* thread_pool, TimingLogger* timings) {
2322  for (size_t i = 0; i != dex_files.size(); ++i) {
2323    const DexFile* dex_file = dex_files[i];
2324    CHECK(dex_file != nullptr);
2325    InitializeClasses(class_loader, *dex_file, dex_files, thread_pool, timings);
2326  }
2327  if (IsImage()) {
2328    // Prune garbage objects created during aborted transactions.
2329    Runtime::Current()->GetHeap()->CollectGarbage(true);
2330  }
2331}
2332
2333void CompilerDriver::Compile(jobject class_loader, const std::vector<const DexFile*>& dex_files,
2334                             ThreadPool* thread_pool, TimingLogger* timings) {
2335  for (size_t i = 0; i != dex_files.size(); ++i) {
2336    const DexFile* dex_file = dex_files[i];
2337    CHECK(dex_file != nullptr);
2338    CompileDexFile(class_loader, *dex_file, dex_files, thread_pool, timings);
2339  }
2340  VLOG(compiler) << "Compile: " << GetMemoryUsageString(false);
2341}
2342
2343class CompileClassVisitor : public CompilationVisitor {
2344 public:
2345  explicit CompileClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2346
2347  virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2348    ATRACE_CALL();
2349    const DexFile& dex_file = *manager_->GetDexFile();
2350    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2351    ClassLinker* class_linker = manager_->GetClassLinker();
2352    jobject jclass_loader = manager_->GetClassLoader();
2353    ClassReference ref(&dex_file, class_def_index);
2354    // Skip compiling classes with generic verifier failures since they will still fail at runtime
2355    if (manager_->GetCompiler()->verification_results_->IsClassRejected(ref)) {
2356      return;
2357    }
2358    // Use a scoped object access to perform to the quick SkipClass check.
2359    const char* descriptor = dex_file.GetClassDescriptor(class_def);
2360    ScopedObjectAccess soa(Thread::Current());
2361    StackHandleScope<3> hs(soa.Self());
2362    Handle<mirror::ClassLoader> class_loader(
2363        hs.NewHandle(soa.Decode<mirror::ClassLoader*>(jclass_loader)));
2364    Handle<mirror::Class> klass(
2365        hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2366    Handle<mirror::DexCache> dex_cache;
2367    if (klass.Get() == nullptr) {
2368      soa.Self()->AssertPendingException();
2369      soa.Self()->ClearException();
2370      dex_cache = hs.NewHandle(class_linker->FindDexCache(soa.Self(), dex_file));
2371    } else if (SkipClass(jclass_loader, dex_file, klass.Get())) {
2372      return;
2373    } else {
2374      dex_cache = hs.NewHandle(klass->GetDexCache());
2375    }
2376
2377    const uint8_t* class_data = dex_file.GetClassData(class_def);
2378    if (class_data == nullptr) {
2379      // empty class, probably a marker interface
2380      return;
2381    }
2382
2383    // Go to native so that we don't block GC during compilation.
2384    ScopedThreadSuspension sts(soa.Self(), kNative);
2385
2386    CompilerDriver* const driver = manager_->GetCompiler();
2387
2388    // Can we run DEX-to-DEX compiler on this class ?
2389    optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level =
2390        GetDexToDexCompilationLevel(soa.Self(), *driver, jclass_loader, dex_file, class_def);
2391
2392    ClassDataItemIterator it(dex_file, class_data);
2393    // Skip fields
2394    while (it.HasNextStaticField()) {
2395      it.Next();
2396    }
2397    while (it.HasNextInstanceField()) {
2398      it.Next();
2399    }
2400
2401    bool compilation_enabled = driver->IsClassToCompile(
2402        dex_file.StringByTypeIdx(class_def.class_idx_));
2403
2404    // Compile direct methods
2405    int64_t previous_direct_method_idx = -1;
2406    while (it.HasNextDirectMethod()) {
2407      uint32_t method_idx = it.GetMemberIndex();
2408      if (method_idx == previous_direct_method_idx) {
2409        // smali can create dex files with two encoded_methods sharing the same method_idx
2410        // http://code.google.com/p/smali/issues/detail?id=119
2411        it.Next();
2412        continue;
2413      }
2414      previous_direct_method_idx = method_idx;
2415      CompileMethod(soa.Self(), driver, it.GetMethodCodeItem(), it.GetMethodAccessFlags(),
2416                    it.GetMethodInvokeType(class_def), class_def_index,
2417                    method_idx, jclass_loader, dex_file, dex_to_dex_compilation_level,
2418                    compilation_enabled, dex_cache);
2419      it.Next();
2420    }
2421    // Compile virtual methods
2422    int64_t previous_virtual_method_idx = -1;
2423    while (it.HasNextVirtualMethod()) {
2424      uint32_t method_idx = it.GetMemberIndex();
2425      if (method_idx == previous_virtual_method_idx) {
2426        // smali can create dex files with two encoded_methods sharing the same method_idx
2427        // http://code.google.com/p/smali/issues/detail?id=119
2428        it.Next();
2429        continue;
2430      }
2431      previous_virtual_method_idx = method_idx;
2432      CompileMethod(soa.Self(), driver, it.GetMethodCodeItem(), it.GetMethodAccessFlags(),
2433                    it.GetMethodInvokeType(class_def), class_def_index,
2434                    method_idx, jclass_loader, dex_file, dex_to_dex_compilation_level,
2435                    compilation_enabled, dex_cache);
2436      it.Next();
2437    }
2438    DCHECK(!it.HasNext());
2439  }
2440
2441 private:
2442  const ParallelCompilationManager* const manager_;
2443};
2444
2445void CompilerDriver::CompileDexFile(jobject class_loader, const DexFile& dex_file,
2446                                    const std::vector<const DexFile*>& dex_files,
2447                                    ThreadPool* thread_pool, TimingLogger* timings) {
2448  TimingLogger::ScopedTiming t("Compile Dex File", timings);
2449  ParallelCompilationManager context(Runtime::Current()->GetClassLinker(), class_loader, this,
2450                                     &dex_file, dex_files, thread_pool);
2451  CompileClassVisitor visitor(&context);
2452  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count_);
2453}
2454
2455void CompilerDriver::AddCompiledMethod(const MethodReference& method_ref,
2456                                       CompiledMethod* const compiled_method,
2457                                       size_t non_relative_linker_patch_count) {
2458  DCHECK(GetCompiledMethod(method_ref) == nullptr)
2459      << PrettyMethod(method_ref.dex_method_index, *method_ref.dex_file);
2460  {
2461    MutexLock mu(Thread::Current(), compiled_methods_lock_);
2462    compiled_methods_.Put(method_ref, compiled_method);
2463    non_relative_linker_patch_count_ += non_relative_linker_patch_count;
2464  }
2465  DCHECK(GetCompiledMethod(method_ref) != nullptr)
2466      << PrettyMethod(method_ref.dex_method_index, *method_ref.dex_file);
2467}
2468
2469void CompilerDriver::RemoveCompiledMethod(const MethodReference& method_ref) {
2470  CompiledMethod* compiled_method = nullptr;
2471  {
2472    MutexLock mu(Thread::Current(), compiled_methods_lock_);
2473    auto it = compiled_methods_.find(method_ref);
2474    if (it != compiled_methods_.end()) {
2475      compiled_method = it->second;
2476      compiled_methods_.erase(it);
2477    }
2478  }
2479  if (compiled_method != nullptr) {
2480    CompiledMethod::ReleaseSwapAllocatedCompiledMethod(this, compiled_method);
2481  }
2482}
2483
2484CompiledClass* CompilerDriver::GetCompiledClass(ClassReference ref) const {
2485  MutexLock mu(Thread::Current(), compiled_classes_lock_);
2486  ClassTable::const_iterator it = compiled_classes_.find(ref);
2487  if (it == compiled_classes_.end()) {
2488    return nullptr;
2489  }
2490  CHECK(it->second != nullptr);
2491  return it->second;
2492}
2493
2494void CompilerDriver::RecordClassStatus(ClassReference ref, mirror::Class::Status status) {
2495  MutexLock mu(Thread::Current(), compiled_classes_lock_);
2496  auto it = compiled_classes_.find(ref);
2497  if (it == compiled_classes_.end() || it->second->GetStatus() != status) {
2498    // An entry doesn't exist or the status is lower than the new status.
2499    if (it != compiled_classes_.end()) {
2500      CHECK_GT(status, it->second->GetStatus());
2501      delete it->second;
2502    }
2503    switch (status) {
2504      case mirror::Class::kStatusNotReady:
2505      case mirror::Class::kStatusError:
2506      case mirror::Class::kStatusRetryVerificationAtRuntime:
2507      case mirror::Class::kStatusVerified:
2508      case mirror::Class::kStatusInitialized:
2509        break;  // Expected states.
2510      default:
2511        LOG(FATAL) << "Unexpected class status for class "
2512            << PrettyDescriptor(ref.first->GetClassDescriptor(ref.first->GetClassDef(ref.second)))
2513            << " of " << status;
2514    }
2515    CompiledClass* compiled_class = new CompiledClass(status);
2516    compiled_classes_.Overwrite(ref, compiled_class);
2517  }
2518}
2519
2520CompiledMethod* CompilerDriver::GetCompiledMethod(MethodReference ref) const {
2521  MutexLock mu(Thread::Current(), compiled_methods_lock_);
2522  MethodTable::const_iterator it = compiled_methods_.find(ref);
2523  if (it == compiled_methods_.end()) {
2524    return nullptr;
2525  }
2526  CHECK(it->second != nullptr);
2527  return it->second;
2528}
2529
2530bool CompilerDriver::IsMethodVerifiedWithoutFailures(uint32_t method_idx,
2531                                                     uint16_t class_def_idx,
2532                                                     const DexFile& dex_file) const {
2533  const VerifiedMethod* verified_method = GetVerifiedMethod(&dex_file, method_idx);
2534  if (verified_method != nullptr) {
2535    return !verified_method->HasVerificationFailures();
2536  }
2537
2538  // If we can't find verification metadata, check if this is a system class (we trust that system
2539  // classes have their methods verified). If it's not, be conservative and assume the method
2540  // has not been verified successfully.
2541
2542  // TODO: When compiling the boot image it should be safe to assume that everything is verified,
2543  // even if methods are not found in the verification cache.
2544  const char* descriptor = dex_file.GetClassDescriptor(dex_file.GetClassDef(class_def_idx));
2545  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2546  Thread* self = Thread::Current();
2547  ScopedObjectAccess soa(self);
2548  bool is_system_class = class_linker->FindSystemClass(self, descriptor) != nullptr;
2549  if (!is_system_class) {
2550    self->ClearException();
2551  }
2552  return is_system_class;
2553}
2554
2555size_t CompilerDriver::GetNonRelativeLinkerPatchCount() const {
2556  MutexLock mu(Thread::Current(), compiled_methods_lock_);
2557  return non_relative_linker_patch_count_;
2558}
2559
2560void CompilerDriver::AddRequiresConstructorBarrier(Thread* self, const DexFile* dex_file,
2561                                                   uint16_t class_def_index) {
2562  WriterMutexLock mu(self, freezing_constructor_lock_);
2563  freezing_constructor_classes_.insert(ClassReference(dex_file, class_def_index));
2564}
2565
2566bool CompilerDriver::RequiresConstructorBarrier(Thread* self, const DexFile* dex_file,
2567                                                uint16_t class_def_index) const {
2568  ReaderMutexLock mu(self, freezing_constructor_lock_);
2569  return freezing_constructor_classes_.count(ClassReference(dex_file, class_def_index)) != 0;
2570}
2571
2572bool CompilerDriver::WriteElf(const std::string& android_root,
2573                              bool is_host,
2574                              const std::vector<const art::DexFile*>& dex_files,
2575                              OatWriter* oat_writer,
2576                              art::File* file)
2577    SHARED_REQUIRES(Locks::mutator_lock_) {
2578  if (kProduce64BitELFFiles && Is64BitInstructionSet(GetInstructionSet())) {
2579    return art::ElfWriterQuick64::Create(file, oat_writer, dex_files, android_root, is_host, *this);
2580  } else {
2581    return art::ElfWriterQuick32::Create(file, oat_writer, dex_files, android_root, is_host, *this);
2582  }
2583}
2584
2585bool CompilerDriver::SkipCompilation(const std::string& method_name) {
2586  if (!profile_present_) {
2587    return false;
2588  }
2589  // First find the method in the profile file.
2590  ProfileFile::ProfileData data;
2591  if (!profile_file_.GetProfileData(&data, method_name)) {
2592    // Not in profile, no information can be determined.
2593    if (kIsDebugBuild) {
2594      VLOG(compiler) << "not compiling " << method_name << " because it's not in the profile";
2595    }
2596    return true;
2597  }
2598
2599  // Methods that comprise top_k_threshold % of the total samples will be compiled.
2600  // Compare against the start of the topK percentage bucket just in case the threshold
2601  // falls inside a bucket.
2602  bool compile = data.GetTopKUsedPercentage() - data.GetUsedPercent()
2603                 <= compiler_options_->GetTopKProfileThreshold();
2604  if (kIsDebugBuild) {
2605    if (compile) {
2606      LOG(INFO) << "compiling method " << method_name << " because its usage is part of top "
2607          << data.GetTopKUsedPercentage() << "% with a percent of " << data.GetUsedPercent() << "%"
2608          << " (topKThreshold=" << compiler_options_->GetTopKProfileThreshold() << ")";
2609    } else {
2610      VLOG(compiler) << "not compiling method " << method_name
2611          << " because it's not part of leading " << compiler_options_->GetTopKProfileThreshold()
2612          << "% samples)";
2613    }
2614  }
2615  return !compile;
2616}
2617
2618std::string CompilerDriver::GetMemoryUsageString(bool extended) const {
2619  std::ostringstream oss;
2620  Runtime* const runtime = Runtime::Current();
2621  const ArenaPool* arena_pool = runtime->GetArenaPool();
2622  gc::Heap* const heap = runtime->GetHeap();
2623  oss << "arena alloc=" << PrettySize(arena_pool->GetBytesAllocated());
2624  oss << " java alloc=" << PrettySize(heap->GetBytesAllocated());
2625#if defined(__BIONIC__) || defined(__GLIBC__)
2626  struct mallinfo info = mallinfo();
2627  const size_t allocated_space = static_cast<size_t>(info.uordblks);
2628  const size_t free_space = static_cast<size_t>(info.fordblks);
2629  oss << " native alloc=" << PrettySize(allocated_space) << " free="
2630      << PrettySize(free_space);
2631#endif
2632  if (swap_space_.get() != nullptr) {
2633    oss << " swap=" << PrettySize(swap_space_->GetSize());
2634  }
2635  if (extended) {
2636    oss << "\nCode dedupe: " << dedupe_code_.DumpStats();
2637    oss << "\nMapping table dedupe: " << dedupe_mapping_table_.DumpStats();
2638    oss << "\nVmap table dedupe: " << dedupe_vmap_table_.DumpStats();
2639    oss << "\nGC map dedupe: " << dedupe_gc_map_.DumpStats();
2640    oss << "\nCFI info dedupe: " << dedupe_cfi_info_.DumpStats();
2641  }
2642  return oss.str();
2643}
2644
2645bool CompilerDriver::IsStringTypeIndex(uint16_t type_index, const DexFile* dex_file) {
2646  const char* type = dex_file->GetTypeDescriptor(dex_file->GetTypeId(type_index));
2647  return strcmp(type, "Ljava/lang/String;") == 0;
2648}
2649
2650bool CompilerDriver::IsStringInit(uint32_t method_index, const DexFile* dex_file, int32_t* offset) {
2651  DexFileMethodInliner* inliner = GetMethodInlinerMap()->GetMethodInliner(dex_file);
2652  size_t pointer_size = InstructionSetPointerSize(GetInstructionSet());
2653  *offset = inliner->GetOffsetForStringInit(method_index, pointer_size);
2654  return inliner->IsStringInitMethodIndex(method_index);
2655}
2656
2657}  // namespace art
2658