compiler_driver.cc revision b2ec9f5c128673c43f776cbe12c8eeb0a6884ebb
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#include <unistd.h>
20#include <unordered_set>
21#include <vector>
22
23#ifndef __APPLE__
24#include <malloc.h>  // For mallinfo
25#endif
26
27#include "android-base/strings.h"
28
29#include "art_field-inl.h"
30#include "art_method-inl.h"
31#include "base/arena_allocator.h"
32#include "base/array_ref.h"
33#include "base/bit_vector.h"
34#include "base/enums.h"
35#include "base/logging.h"  // For VLOG
36#include "base/stl_util.h"
37#include "base/systrace.h"
38#include "base/time_utils.h"
39#include "base/timing_logger.h"
40#include "class_linker-inl.h"
41#include "compiled_method-inl.h"
42#include "compiler.h"
43#include "compiler_callbacks.h"
44#include "compiler_driver-inl.h"
45#include "dex/descriptors_names.h"
46#include "dex/dex_file-inl.h"
47#include "dex/dex_file_annotations.h"
48#include "dex/dex_instruction-inl.h"
49#include "dex/dex_to_dex_compiler.h"
50#include "dex/verification_results.h"
51#include "dex/verified_method.h"
52#include "dex_compilation_unit.h"
53#include "driver/compiler_options.h"
54#include "gc/accounting/card_table-inl.h"
55#include "gc/accounting/heap_bitmap.h"
56#include "gc/space/image_space.h"
57#include "gc/space/space.h"
58#include "handle_scope-inl.h"
59#include "intrinsics_enum.h"
60#include "jit/profile_compilation_info.h"
61#include "jni_internal.h"
62#include "linker/linker_patch.h"
63#include "mirror/class-inl.h"
64#include "mirror/class_loader.h"
65#include "mirror/dex_cache-inl.h"
66#include "mirror/object-inl.h"
67#include "mirror/object-refvisitor-inl.h"
68#include "mirror/object_array-inl.h"
69#include "mirror/throwable.h"
70#include "nativehelper/ScopedLocalRef.h"
71#include "object_lock.h"
72#include "runtime.h"
73#include "runtime_intrinsics.h"
74#include "scoped_thread_state_change-inl.h"
75#include "thread.h"
76#include "thread_list.h"
77#include "thread_pool.h"
78#include "trampolines/trampoline_compiler.h"
79#include "transaction.h"
80#include "utils/atomic_dex_ref_map-inl.h"
81#include "utils/dex_cache_arrays_layout-inl.h"
82#include "utils/swap_space.h"
83#include "vdex_file.h"
84#include "verifier/method_verifier-inl.h"
85#include "verifier/method_verifier.h"
86#include "verifier/verifier_deps.h"
87#include "verifier/verifier_enums.h"
88
89namespace art {
90
91static constexpr bool kTimeCompileMethod = !kIsDebugBuild;
92
93// Print additional info during profile guided compilation.
94static constexpr bool kDebugProfileGuidedCompilation = false;
95
96// Max encoded fields allowed for initializing app image. Hardcode the number for now
97// because 5000 should be large enough.
98static constexpr uint32_t kMaxEncodedFields = 5000;
99
100static double Percentage(size_t x, size_t y) {
101  return 100.0 * (static_cast<double>(x)) / (static_cast<double>(x + y));
102}
103
104static void DumpStat(size_t x, size_t y, const char* str) {
105  if (x == 0 && y == 0) {
106    return;
107  }
108  LOG(INFO) << Percentage(x, y) << "% of " << str << " for " << (x + y) << " cases";
109}
110
111class CompilerDriver::AOTCompilationStats {
112 public:
113  AOTCompilationStats()
114      : stats_lock_("AOT compilation statistics lock"),
115        resolved_types_(0), unresolved_types_(0),
116        resolved_instance_fields_(0), unresolved_instance_fields_(0),
117        resolved_local_static_fields_(0), resolved_static_fields_(0), unresolved_static_fields_(0),
118        type_based_devirtualization_(0),
119        safe_casts_(0), not_safe_casts_(0) {
120    for (size_t i = 0; i <= kMaxInvokeType; i++) {
121      resolved_methods_[i] = 0;
122      unresolved_methods_[i] = 0;
123      virtual_made_direct_[i] = 0;
124      direct_calls_to_boot_[i] = 0;
125      direct_methods_to_boot_[i] = 0;
126    }
127  }
128
129  void Dump() {
130    DumpStat(resolved_types_, unresolved_types_, "types resolved");
131    DumpStat(resolved_instance_fields_, unresolved_instance_fields_, "instance fields resolved");
132    DumpStat(resolved_local_static_fields_ + resolved_static_fields_, unresolved_static_fields_,
133             "static fields resolved");
134    DumpStat(resolved_local_static_fields_, resolved_static_fields_ + unresolved_static_fields_,
135             "static fields local to a class");
136    DumpStat(safe_casts_, not_safe_casts_, "check-casts removed based on type information");
137    // Note, the code below subtracts the stat value so that when added to the stat value we have
138    // 100% of samples. TODO: clean this up.
139    DumpStat(type_based_devirtualization_,
140             resolved_methods_[kVirtual] + unresolved_methods_[kVirtual] +
141             resolved_methods_[kInterface] + unresolved_methods_[kInterface] -
142             type_based_devirtualization_,
143             "virtual/interface calls made direct based on type information");
144
145    for (size_t i = 0; i <= kMaxInvokeType; i++) {
146      std::ostringstream oss;
147      oss << static_cast<InvokeType>(i) << " methods were AOT resolved";
148      DumpStat(resolved_methods_[i], unresolved_methods_[i], oss.str().c_str());
149      if (virtual_made_direct_[i] > 0) {
150        std::ostringstream oss2;
151        oss2 << static_cast<InvokeType>(i) << " methods made direct";
152        DumpStat(virtual_made_direct_[i],
153                 resolved_methods_[i] + unresolved_methods_[i] - virtual_made_direct_[i],
154                 oss2.str().c_str());
155      }
156      if (direct_calls_to_boot_[i] > 0) {
157        std::ostringstream oss2;
158        oss2 << static_cast<InvokeType>(i) << " method calls are direct into boot";
159        DumpStat(direct_calls_to_boot_[i],
160                 resolved_methods_[i] + unresolved_methods_[i] - direct_calls_to_boot_[i],
161                 oss2.str().c_str());
162      }
163      if (direct_methods_to_boot_[i] > 0) {
164        std::ostringstream oss2;
165        oss2 << static_cast<InvokeType>(i) << " method calls have methods in boot";
166        DumpStat(direct_methods_to_boot_[i],
167                 resolved_methods_[i] + unresolved_methods_[i] - direct_methods_to_boot_[i],
168                 oss2.str().c_str());
169      }
170    }
171  }
172
173// Allow lossy statistics in non-debug builds.
174#ifndef NDEBUG
175#define STATS_LOCK() MutexLock mu(Thread::Current(), stats_lock_)
176#else
177#define STATS_LOCK()
178#endif
179
180  void TypeDoesntNeedAccessCheck() REQUIRES(!stats_lock_) {
181    STATS_LOCK();
182    resolved_types_++;
183  }
184
185  void TypeNeedsAccessCheck() REQUIRES(!stats_lock_) {
186    STATS_LOCK();
187    unresolved_types_++;
188  }
189
190  void ResolvedInstanceField() REQUIRES(!stats_lock_) {
191    STATS_LOCK();
192    resolved_instance_fields_++;
193  }
194
195  void UnresolvedInstanceField() REQUIRES(!stats_lock_) {
196    STATS_LOCK();
197    unresolved_instance_fields_++;
198  }
199
200  void ResolvedLocalStaticField() REQUIRES(!stats_lock_) {
201    STATS_LOCK();
202    resolved_local_static_fields_++;
203  }
204
205  void ResolvedStaticField() REQUIRES(!stats_lock_) {
206    STATS_LOCK();
207    resolved_static_fields_++;
208  }
209
210  void UnresolvedStaticField() REQUIRES(!stats_lock_) {
211    STATS_LOCK();
212    unresolved_static_fields_++;
213  }
214
215  // Indicate that type information from the verifier led to devirtualization.
216  void PreciseTypeDevirtualization() REQUIRES(!stats_lock_) {
217    STATS_LOCK();
218    type_based_devirtualization_++;
219  }
220
221  // A check-cast could be eliminated due to verifier type analysis.
222  void SafeCast() REQUIRES(!stats_lock_) {
223    STATS_LOCK();
224    safe_casts_++;
225  }
226
227  // A check-cast couldn't be eliminated due to verifier type analysis.
228  void NotASafeCast() REQUIRES(!stats_lock_) {
229    STATS_LOCK();
230    not_safe_casts_++;
231  }
232
233 private:
234  Mutex stats_lock_;
235
236  size_t resolved_types_;
237  size_t unresolved_types_;
238
239  size_t resolved_instance_fields_;
240  size_t unresolved_instance_fields_;
241
242  size_t resolved_local_static_fields_;
243  size_t resolved_static_fields_;
244  size_t unresolved_static_fields_;
245  // Type based devirtualization for invoke interface and virtual.
246  size_t type_based_devirtualization_;
247
248  size_t resolved_methods_[kMaxInvokeType + 1];
249  size_t unresolved_methods_[kMaxInvokeType + 1];
250  size_t virtual_made_direct_[kMaxInvokeType + 1];
251  size_t direct_calls_to_boot_[kMaxInvokeType + 1];
252  size_t direct_methods_to_boot_[kMaxInvokeType + 1];
253
254  size_t safe_casts_;
255  size_t not_safe_casts_;
256
257  DISALLOW_COPY_AND_ASSIGN(AOTCompilationStats);
258};
259
260CompilerDriver::CompilerDriver(
261    const CompilerOptions* compiler_options,
262    VerificationResults* verification_results,
263    Compiler::Kind compiler_kind,
264    InstructionSet instruction_set,
265    const InstructionSetFeatures* instruction_set_features,
266    std::unordered_set<std::string>* image_classes,
267    std::unordered_set<std::string>* compiled_classes,
268    std::unordered_set<std::string>* compiled_methods,
269    size_t thread_count,
270    int swap_fd,
271    const ProfileCompilationInfo* profile_compilation_info)
272    : compiler_options_(compiler_options),
273      verification_results_(verification_results),
274      compiler_(Compiler::Create(this, compiler_kind)),
275      compiler_kind_(compiler_kind),
276      instruction_set_(
277          instruction_set == InstructionSet::kArm ? InstructionSet::kThumb2 : instruction_set),
278      instruction_set_features_(instruction_set_features),
279      requires_constructor_barrier_lock_("constructor barrier lock"),
280      non_relative_linker_patch_count_(0u),
281      image_classes_(image_classes),
282      classes_to_compile_(compiled_classes),
283      methods_to_compile_(compiled_methods),
284      number_of_soft_verifier_failures_(0),
285      had_hard_verifier_failure_(false),
286      parallel_thread_count_(thread_count),
287      stats_(new AOTCompilationStats),
288      compiler_context_(nullptr),
289      support_boot_image_fixup_(true),
290      compiled_method_storage_(swap_fd),
291      profile_compilation_info_(profile_compilation_info),
292      max_arena_alloc_(0),
293      dex_to_dex_compiler_(this) {
294  DCHECK(compiler_options_ != nullptr);
295
296  compiler_->Init();
297
298  if (GetCompilerOptions().IsBootImage()) {
299    CHECK(image_classes_.get() != nullptr) << "Expected image classes for boot image";
300  }
301
302  compiled_method_storage_.SetDedupeEnabled(compiler_options_->DeduplicateCode());
303}
304
305CompilerDriver::~CompilerDriver() {
306  compiled_methods_.Visit([this](const DexFileReference& ref ATTRIBUTE_UNUSED,
307                                 CompiledMethod* method) {
308    if (method != nullptr) {
309      CompiledMethod::ReleaseSwapAllocatedCompiledMethod(this, method);
310    }
311  });
312  compiler_->UnInit();
313}
314
315
316#define CREATE_TRAMPOLINE(type, abi, offset) \
317    if (Is64BitInstructionSet(instruction_set_)) { \
318      return CreateTrampoline64(instruction_set_, abi, \
319                                type ## _ENTRYPOINT_OFFSET(PointerSize::k64, offset)); \
320    } else { \
321      return CreateTrampoline32(instruction_set_, abi, \
322                                type ## _ENTRYPOINT_OFFSET(PointerSize::k32, offset)); \
323    }
324
325std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateJniDlsymLookup() const {
326  CREATE_TRAMPOLINE(JNI, kJniAbi, pDlsymLookup)
327}
328
329std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickGenericJniTrampoline()
330    const {
331  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickGenericJniTrampoline)
332}
333
334std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickImtConflictTrampoline()
335    const {
336  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickImtConflictTrampoline)
337}
338
339std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickResolutionTrampoline()
340    const {
341  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickResolutionTrampoline)
342}
343
344std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickToInterpreterBridge()
345    const {
346  CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickToInterpreterBridge)
347}
348#undef CREATE_TRAMPOLINE
349
350void CompilerDriver::CompileAll(jobject class_loader,
351                                const std::vector<const DexFile*>& dex_files,
352                                TimingLogger* timings) {
353  DCHECK(!Runtime::Current()->IsStarted());
354
355  InitializeThreadPools();
356
357  VLOG(compiler) << "Before precompile " << GetMemoryUsageString(false);
358  // Precompile:
359  // 1) Load image classes
360  // 2) Resolve all classes
361  // 3) Attempt to verify all classes
362  // 4) Attempt to initialize image classes, and trivially initialized classes
363  PreCompile(class_loader, dex_files, timings);
364  if (GetCompilerOptions().IsBootImage()) {
365    // We don't need to setup the intrinsics for non boot image compilation, as
366    // those compilations will pick up a boot image that have the ArtMethod already
367    // set with the intrinsics flag.
368    InitializeIntrinsics();
369  }
370  // Compile:
371  // 1) Compile all classes and methods enabled for compilation. May fall back to dex-to-dex
372  //    compilation.
373  if (GetCompilerOptions().IsAnyCompilationEnabled()) {
374    Compile(class_loader, dex_files, timings);
375  }
376  if (GetCompilerOptions().GetDumpStats()) {
377    stats_->Dump();
378  }
379
380  FreeThreadPools();
381}
382
383static optimizer::DexToDexCompiler::CompilationLevel GetDexToDexCompilationLevel(
384    Thread* self, const CompilerDriver& driver, Handle<mirror::ClassLoader> class_loader,
385    const DexFile& dex_file, const DexFile::ClassDef& class_def)
386    REQUIRES_SHARED(Locks::mutator_lock_) {
387  // When the dex file is uncompressed in the APK, we do not generate a copy in the .vdex
388  // file. As a result, dex2oat will map the dex file read-only, and we only need to check
389  // that to know if we can do quickening.
390  if (dex_file.GetContainer() != nullptr && dex_file.GetContainer()->IsReadOnly()) {
391    return optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
392  }
393  auto* const runtime = Runtime::Current();
394  DCHECK(driver.GetCompilerOptions().IsQuickeningCompilationEnabled());
395  const char* descriptor = dex_file.GetClassDescriptor(class_def);
396  ClassLinker* class_linker = runtime->GetClassLinker();
397  mirror::Class* klass = class_linker->FindClass(self, descriptor, class_loader);
398  if (klass == nullptr) {
399    CHECK(self->IsExceptionPending());
400    self->ClearException();
401    return optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
402  }
403  // DexToDex at the kOptimize level may introduce quickened opcodes, which replace symbolic
404  // references with actual offsets. We cannot re-verify such instructions.
405  //
406  // We store the verification information in the class status in the oat file, which the linker
407  // can validate (checksums) and use to skip load-time verification. It is thus safe to
408  // optimize when a class has been fully verified before.
409  optimizer::DexToDexCompiler::CompilationLevel max_level =
410      optimizer::DexToDexCompiler::CompilationLevel::kOptimize;
411  if (driver.GetCompilerOptions().GetDebuggable()) {
412    // We are debuggable so definitions of classes might be changed. We don't want to do any
413    // optimizations that could break that.
414    max_level = optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
415  }
416  if (klass->IsVerified()) {
417    // Class is verified so we can enable DEX-to-DEX compilation for performance.
418    return max_level;
419  } else {
420    // Class verification has failed: do not run DEX-to-DEX optimizations.
421    return optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile;
422  }
423}
424
425static optimizer::DexToDexCompiler::CompilationLevel GetDexToDexCompilationLevel(
426    Thread* self,
427    const CompilerDriver& driver,
428    jobject jclass_loader,
429    const DexFile& dex_file,
430    const DexFile::ClassDef& class_def) {
431  ScopedObjectAccess soa(self);
432  StackHandleScope<1> hs(soa.Self());
433  Handle<mirror::ClassLoader> class_loader(
434      hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
435  return GetDexToDexCompilationLevel(self, driver, class_loader, dex_file, class_def);
436}
437
438// Does the runtime for the InstructionSet provide an implementation returned by
439// GetQuickGenericJniStub allowing down calls that aren't compiled using a JNI compiler?
440static bool InstructionSetHasGenericJniStub(InstructionSet isa) {
441  switch (isa) {
442    case InstructionSet::kArm:
443    case InstructionSet::kArm64:
444    case InstructionSet::kThumb2:
445    case InstructionSet::kMips:
446    case InstructionSet::kMips64:
447    case InstructionSet::kX86:
448    case InstructionSet::kX86_64: return true;
449    default: return false;
450  }
451}
452
453template <typename CompileFn>
454static void CompileMethodHarness(
455    Thread* self,
456    CompilerDriver* driver,
457    const DexFile::CodeItem* code_item,
458    uint32_t access_flags,
459    InvokeType invoke_type,
460    uint16_t class_def_idx,
461    uint32_t method_idx,
462    Handle<mirror::ClassLoader> class_loader,
463    const DexFile& dex_file,
464    optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
465    bool compilation_enabled,
466    Handle<mirror::DexCache> dex_cache,
467    CompileFn compile_fn) {
468  DCHECK(driver != nullptr);
469  CompiledMethod* compiled_method;
470  uint64_t start_ns = kTimeCompileMethod ? NanoTime() : 0;
471  MethodReference method_ref(&dex_file, method_idx);
472
473  compiled_method = compile_fn(self,
474                               driver,
475                               code_item,
476                               access_flags,
477                               invoke_type,
478                               class_def_idx,
479                               method_idx,
480                               class_loader,
481                               dex_file,
482                               dex_to_dex_compilation_level,
483                               compilation_enabled,
484                               dex_cache);
485
486  if (kTimeCompileMethod) {
487    uint64_t duration_ns = NanoTime() - start_ns;
488    if (duration_ns > MsToNs(driver->GetCompiler()->GetMaximumCompilationTimeBeforeWarning())) {
489      LOG(WARNING) << "Compilation of " << dex_file.PrettyMethod(method_idx)
490                   << " took " << PrettyDuration(duration_ns);
491    }
492  }
493
494  if (compiled_method != nullptr) {
495    // Count non-relative linker patches.
496    size_t non_relative_linker_patch_count = 0u;
497    for (const linker::LinkerPatch& patch : compiled_method->GetPatches()) {
498      if (!patch.IsPcRelative()) {
499        ++non_relative_linker_patch_count;
500      }
501    }
502    bool compile_pic = driver->GetCompilerOptions().GetCompilePic();  // Off by default
503    // When compiling with PIC, there should be zero non-relative linker patches
504    CHECK(!compile_pic || non_relative_linker_patch_count == 0u);
505
506    driver->AddCompiledMethod(method_ref, compiled_method, non_relative_linker_patch_count);
507  }
508
509  if (self->IsExceptionPending()) {
510    ScopedObjectAccess soa(self);
511    LOG(FATAL) << "Unexpected exception compiling: " << dex_file.PrettyMethod(method_idx) << "\n"
512        << self->GetException()->Dump();
513  }
514}
515
516static void CompileMethodDex2Dex(
517    Thread* self,
518    CompilerDriver* driver,
519    const DexFile::CodeItem* code_item,
520    uint32_t access_flags,
521    InvokeType invoke_type,
522    uint16_t class_def_idx,
523    uint32_t method_idx,
524    Handle<mirror::ClassLoader> class_loader,
525    const DexFile& dex_file,
526    optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
527    bool compilation_enabled,
528    Handle<mirror::DexCache> dex_cache) {
529  auto dex_2_dex_fn = [](Thread* self ATTRIBUTE_UNUSED,
530      CompilerDriver* driver,
531      const DexFile::CodeItem* code_item,
532      uint32_t access_flags,
533      InvokeType invoke_type,
534      uint16_t class_def_idx,
535      uint32_t method_idx,
536      Handle<mirror::ClassLoader> class_loader,
537      const DexFile& dex_file,
538      optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
539      bool compilation_enabled ATTRIBUTE_UNUSED,
540      Handle<mirror::DexCache> dex_cache ATTRIBUTE_UNUSED) -> CompiledMethod* {
541    DCHECK(driver != nullptr);
542    MethodReference method_ref(&dex_file, method_idx);
543
544    optimizer::DexToDexCompiler* const compiler = &driver->GetDexToDexCompiler();
545
546    if (compiler->ShouldCompileMethod(method_ref)) {
547      VerificationResults* results = driver->GetVerificationResults();
548      DCHECK(results != nullptr);
549      const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref);
550      // Do not optimize if a VerifiedMethod is missing. SafeCast elision,
551      // for example, relies on it.
552      return compiler->CompileMethod(
553          code_item,
554          access_flags,
555          invoke_type,
556          class_def_idx,
557          method_idx,
558          class_loader,
559          dex_file,
560          (verified_method != nullptr)
561          ? dex_to_dex_compilation_level
562              : optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile);
563    }
564    return nullptr;
565  };
566  CompileMethodHarness(self,
567                       driver,
568                       code_item,
569                       access_flags,
570                       invoke_type,
571                       class_def_idx,
572                       method_idx,
573                       class_loader,
574                       dex_file,
575                       dex_to_dex_compilation_level,
576                       compilation_enabled,
577                       dex_cache,
578                       dex_2_dex_fn);
579}
580
581static void CompileMethodQuick(
582    Thread* self,
583    CompilerDriver* driver,
584    const DexFile::CodeItem* code_item,
585    uint32_t access_flags,
586    InvokeType invoke_type,
587    uint16_t class_def_idx,
588    uint32_t method_idx,
589    Handle<mirror::ClassLoader> class_loader,
590    const DexFile& dex_file,
591    optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
592    bool compilation_enabled,
593    Handle<mirror::DexCache> dex_cache) {
594  auto quick_fn = [](
595      Thread* self,
596      CompilerDriver* driver,
597      const DexFile::CodeItem* code_item,
598      uint32_t access_flags,
599      InvokeType invoke_type,
600      uint16_t class_def_idx,
601      uint32_t method_idx,
602      Handle<mirror::ClassLoader> class_loader,
603      const DexFile& dex_file,
604      optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level,
605      bool compilation_enabled,
606      Handle<mirror::DexCache> dex_cache) {
607    DCHECK(driver != nullptr);
608    CompiledMethod* compiled_method = nullptr;
609    MethodReference method_ref(&dex_file, method_idx);
610
611    if ((access_flags & kAccNative) != 0) {
612      // Are we extracting only and have support for generic JNI down calls?
613      if (!driver->GetCompilerOptions().IsJniCompilationEnabled() &&
614          InstructionSetHasGenericJniStub(driver->GetInstructionSet())) {
615        // Leaving this empty will trigger the generic JNI version
616      } else {
617        // Query any JNI optimization annotations such as @FastNative or @CriticalNative.
618        access_flags |= annotations::GetNativeMethodAnnotationAccessFlags(
619            dex_file, dex_file.GetClassDef(class_def_idx), method_idx);
620
621        compiled_method = driver->GetCompiler()->JniCompile(
622            access_flags, method_idx, dex_file, dex_cache);
623        CHECK(compiled_method != nullptr);
624      }
625    } else if ((access_flags & kAccAbstract) != 0) {
626      // Abstract methods don't have code.
627    } else {
628      VerificationResults* results = driver->GetVerificationResults();
629      DCHECK(results != nullptr);
630      const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref);
631      bool compile = compilation_enabled &&
632          // Basic checks, e.g., not <clinit>.
633          results->IsCandidateForCompilation(method_ref, access_flags) &&
634          // Did not fail to create VerifiedMethod metadata.
635          verified_method != nullptr &&
636          // Do not have failures that should punt to the interpreter.
637          !verified_method->HasRuntimeThrow() &&
638          (verified_method->GetEncounteredVerificationFailures() &
639              (verifier::VERIFY_ERROR_FORCE_INTERPRETER | verifier::VERIFY_ERROR_LOCKING)) == 0 &&
640              // Is eligable for compilation by methods-to-compile filter.
641              driver->IsMethodToCompile(method_ref) &&
642              driver->ShouldCompileBasedOnProfile(method_ref);
643
644      if (compile) {
645        // NOTE: if compiler declines to compile this method, it will return null.
646        compiled_method = driver->GetCompiler()->Compile(code_item,
647                                                         access_flags,
648                                                         invoke_type,
649                                                         class_def_idx,
650                                                         method_idx,
651                                                         class_loader,
652                                                         dex_file,
653                                                         dex_cache);
654      }
655      if (compiled_method == nullptr &&
656          dex_to_dex_compilation_level !=
657              optimizer::DexToDexCompiler::CompilationLevel::kDontDexToDexCompile) {
658        DCHECK(!Runtime::Current()->UseJitCompilation());
659        // TODO: add a command-line option to disable DEX-to-DEX compilation ?
660        driver->GetDexToDexCompiler().MarkForCompilation(self, method_ref);
661      }
662    }
663    return compiled_method;
664  };
665  CompileMethodHarness(self,
666                       driver,
667                       code_item,
668                       access_flags,
669                       invoke_type,
670                       class_def_idx,
671                       method_idx,
672                       class_loader,
673                       dex_file,
674                       dex_to_dex_compilation_level,
675                       compilation_enabled,
676                       dex_cache,
677                       quick_fn);
678}
679
680void CompilerDriver::CompileOne(Thread* self, ArtMethod* method, TimingLogger* timings) {
681  DCHECK(!Runtime::Current()->IsStarted());
682  jobject jclass_loader;
683  const DexFile* dex_file;
684  uint16_t class_def_idx;
685  uint32_t method_idx = method->GetDexMethodIndex();
686  uint32_t access_flags = method->GetAccessFlags();
687  InvokeType invoke_type = method->GetInvokeType();
688  StackHandleScope<2> hs(self);
689  Handle<mirror::DexCache> dex_cache(hs.NewHandle(method->GetDexCache()));
690  Handle<mirror::ClassLoader> class_loader(
691      hs.NewHandle(method->GetDeclaringClass()->GetClassLoader()));
692  {
693    ScopedObjectAccessUnchecked soa(self);
694    ScopedLocalRef<jobject> local_class_loader(
695        soa.Env(), soa.AddLocalReference<jobject>(class_loader.Get()));
696    jclass_loader = soa.Env()->NewGlobalRef(local_class_loader.get());
697    // Find the dex_file
698    dex_file = method->GetDexFile();
699    class_def_idx = method->GetClassDefIndex();
700  }
701  const DexFile::CodeItem* code_item = dex_file->GetCodeItem(method->GetCodeItemOffset());
702
703  // Go to native so that we don't block GC during compilation.
704  ScopedThreadSuspension sts(self, kNative);
705
706  std::vector<const DexFile*> dex_files;
707  dex_files.push_back(dex_file);
708
709  InitializeThreadPools();
710
711  PreCompile(jclass_loader, dex_files, timings);
712
713  // Can we run DEX-to-DEX compiler on this class ?
714  optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level =
715      GetDexToDexCompilationLevel(self,
716                                  *this,
717                                  jclass_loader,
718                                  *dex_file,
719                                  dex_file->GetClassDef(class_def_idx));
720
721  CompileMethodQuick(self,
722                     this,
723                     code_item,
724                     access_flags,
725                     invoke_type,
726                     class_def_idx,
727                     method_idx,
728                     class_loader,
729                     *dex_file,
730                     dex_to_dex_compilation_level,
731                     true,
732                     dex_cache);
733
734  const size_t num_methods = dex_to_dex_compiler_.NumCodeItemsToQuicken(self);
735  if (num_methods != 0) {
736    DCHECK_EQ(num_methods, 1u);
737    CompileMethodDex2Dex(self,
738                         this,
739                         code_item,
740                         access_flags,
741                         invoke_type,
742                         class_def_idx,
743                         method_idx,
744                         class_loader,
745                         *dex_file,
746                         dex_to_dex_compilation_level,
747                         true,
748                         dex_cache);
749    dex_to_dex_compiler_.ClearState();
750  }
751
752  FreeThreadPools();
753
754  self->GetJniEnv()->DeleteGlobalRef(jclass_loader);
755}
756
757void CompilerDriver::Resolve(jobject class_loader,
758                             const std::vector<const DexFile*>& dex_files,
759                             TimingLogger* timings) {
760  // Resolution allocates classes and needs to run single-threaded to be deterministic.
761  bool force_determinism = GetCompilerOptions().IsForceDeterminism();
762  ThreadPool* resolve_thread_pool = force_determinism
763                                     ? single_thread_pool_.get()
764                                     : parallel_thread_pool_.get();
765  size_t resolve_thread_count = force_determinism ? 1U : parallel_thread_count_;
766
767  for (size_t i = 0; i != dex_files.size(); ++i) {
768    const DexFile* dex_file = dex_files[i];
769    CHECK(dex_file != nullptr);
770    ResolveDexFile(class_loader,
771                   *dex_file,
772                   dex_files,
773                   resolve_thread_pool,
774                   resolve_thread_count,
775                   timings);
776  }
777}
778
779// Resolve const-strings in the code. Done to have deterministic allocation behavior. Right now
780// this is single-threaded for simplicity.
781// TODO: Collect the relevant string indices in parallel, then allocate them sequentially in a
782//       stable order.
783
784static void ResolveConstStrings(Handle<mirror::DexCache> dex_cache,
785                                const DexFile& dex_file,
786                                const DexFile::CodeItem* code_item)
787      REQUIRES_SHARED(Locks::mutator_lock_) {
788  if (code_item == nullptr) {
789    // Abstract or native method.
790    return;
791  }
792
793  ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
794  for (const DexInstructionPcPair& inst : CodeItemInstructionAccessor(dex_file, code_item)) {
795    switch (inst->Opcode()) {
796      case Instruction::CONST_STRING:
797      case Instruction::CONST_STRING_JUMBO: {
798        dex::StringIndex string_index((inst->Opcode() == Instruction::CONST_STRING)
799            ? inst->VRegB_21c()
800            : inst->VRegB_31c());
801        ObjPtr<mirror::String> string = class_linker->ResolveString(string_index, dex_cache);
802        CHECK(string != nullptr) << "Could not allocate a string when forcing determinism";
803        break;
804      }
805
806      default:
807        break;
808    }
809  }
810}
811
812static void ResolveConstStrings(CompilerDriver* driver,
813                                const std::vector<const DexFile*>& dex_files,
814                                TimingLogger* timings) {
815  ScopedObjectAccess soa(Thread::Current());
816  StackHandleScope<1> hs(soa.Self());
817  ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
818  MutableHandle<mirror::DexCache> dex_cache(hs.NewHandle<mirror::DexCache>(nullptr));
819
820  for (const DexFile* dex_file : dex_files) {
821    dex_cache.Assign(class_linker->FindDexCache(soa.Self(), *dex_file));
822    TimingLogger::ScopedTiming t("Resolve const-string Strings", timings);
823
824    size_t class_def_count = dex_file->NumClassDefs();
825    for (size_t class_def_index = 0; class_def_index < class_def_count; ++class_def_index) {
826      const DexFile::ClassDef& class_def = dex_file->GetClassDef(class_def_index);
827
828      const uint8_t* class_data = dex_file->GetClassData(class_def);
829      if (class_data == nullptr) {
830        // empty class, probably a marker interface
831        continue;
832      }
833
834      ClassDataItemIterator it(*dex_file, class_data);
835      it.SkipAllFields();
836
837      bool compilation_enabled = driver->IsClassToCompile(
838          dex_file->StringByTypeIdx(class_def.class_idx_));
839      if (!compilation_enabled) {
840        // Compilation is skipped, do not resolve const-string in code of this class.
841        // TODO: Make sure that inlining honors this.
842        continue;
843      }
844
845      // Direct and virtual methods.
846      int64_t previous_method_idx = -1;
847      while (it.HasNextMethod()) {
848        uint32_t method_idx = it.GetMemberIndex();
849        if (method_idx == previous_method_idx) {
850          // smali can create dex files with two encoded_methods sharing the same method_idx
851          // http://code.google.com/p/smali/issues/detail?id=119
852          it.Next();
853          continue;
854        }
855        previous_method_idx = method_idx;
856        ResolveConstStrings(dex_cache, *dex_file, it.GetMethodCodeItem());
857        it.Next();
858      }
859      DCHECK(!it.HasNext());
860    }
861  }
862}
863
864inline void CompilerDriver::CheckThreadPools() {
865  DCHECK(parallel_thread_pool_ != nullptr);
866  DCHECK(single_thread_pool_ != nullptr);
867}
868
869static void EnsureVerifiedOrVerifyAtRuntime(jobject jclass_loader,
870                                            const std::vector<const DexFile*>& dex_files) {
871  ScopedObjectAccess soa(Thread::Current());
872  StackHandleScope<2> hs(soa.Self());
873  Handle<mirror::ClassLoader> class_loader(
874      hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
875  MutableHandle<mirror::Class> cls(hs.NewHandle<mirror::Class>(nullptr));
876  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
877
878  for (const DexFile* dex_file : dex_files) {
879    for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
880      const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
881      const char* descriptor = dex_file->GetClassDescriptor(class_def);
882      cls.Assign(class_linker->FindClass(soa.Self(), descriptor, class_loader));
883      if (cls == nullptr) {
884        soa.Self()->ClearException();
885      } else if (&cls->GetDexFile() == dex_file) {
886        DCHECK(cls->IsErroneous() || cls->IsVerified() || cls->ShouldVerifyAtRuntime())
887            << cls->PrettyClass()
888            << " " << cls->GetStatus();
889      }
890    }
891  }
892}
893
894void CompilerDriver::PreCompile(jobject class_loader,
895                                const std::vector<const DexFile*>& dex_files,
896                                TimingLogger* timings) {
897  CheckThreadPools();
898
899  LoadImageClasses(timings);
900  VLOG(compiler) << "LoadImageClasses: " << GetMemoryUsageString(false);
901
902  if (compiler_options_->IsAnyCompilationEnabled()) {
903    // Avoid adding the dex files in the case where we aren't going to add compiled methods.
904    // This reduces RAM usage for this case.
905    for (const DexFile* dex_file : dex_files) {
906      // Can be already inserted if the caller is CompileOne. This happens for gtests.
907      if (!compiled_methods_.HaveDexFile(dex_file)) {
908        compiled_methods_.AddDexFile(dex_file);
909      }
910    }
911    // Resolve eagerly to prepare for compilation.
912    Resolve(class_loader, dex_files, timings);
913    VLOG(compiler) << "Resolve: " << GetMemoryUsageString(false);
914  }
915
916  if (compiler_options_->AssumeClassesAreVerified()) {
917    VLOG(compiler) << "Verify none mode specified, skipping verification.";
918    SetVerified(class_loader, dex_files, timings);
919  }
920
921  if (!compiler_options_->IsVerificationEnabled()) {
922    return;
923  }
924
925  if (GetCompilerOptions().IsForceDeterminism() && GetCompilerOptions().IsBootImage()) {
926    // Resolve strings from const-string. Do this now to have a deterministic image.
927    ResolveConstStrings(this, dex_files, timings);
928    VLOG(compiler) << "Resolve const-strings: " << GetMemoryUsageString(false);
929  }
930
931  Verify(class_loader, dex_files, timings);
932  VLOG(compiler) << "Verify: " << GetMemoryUsageString(false);
933
934  if (had_hard_verifier_failure_ && GetCompilerOptions().AbortOnHardVerifierFailure()) {
935    // Avoid dumping threads. Even if we shut down the thread pools, there will still be three
936    // instances of this thread's stack.
937    LOG(FATAL_WITHOUT_ABORT) << "Had a hard failure verifying all classes, and was asked to abort "
938                             << "in such situations. Please check the log.";
939    abort();
940  } else if (number_of_soft_verifier_failures_ > 0 &&
941             GetCompilerOptions().AbortOnSoftVerifierFailure()) {
942    LOG(FATAL_WITHOUT_ABORT) << "Had " << number_of_soft_verifier_failures_ << " soft failure(s) "
943                             << "verifying all classes, and was asked to abort in such situations. "
944                             << "Please check the log.";
945    abort();
946  }
947
948  if (compiler_options_->IsAnyCompilationEnabled()) {
949    if (kIsDebugBuild) {
950      EnsureVerifiedOrVerifyAtRuntime(class_loader, dex_files);
951    }
952    InitializeClasses(class_loader, dex_files, timings);
953    VLOG(compiler) << "InitializeClasses: " << GetMemoryUsageString(false);
954  }
955
956  UpdateImageClasses(timings);
957  VLOG(compiler) << "UpdateImageClasses: " << GetMemoryUsageString(false);
958}
959
960bool CompilerDriver::IsImageClass(const char* descriptor) const {
961  if (image_classes_ != nullptr) {
962    // If we have a set of image classes, use those.
963    return image_classes_->find(descriptor) != image_classes_->end();
964  }
965  // No set of image classes, assume we include all the classes.
966  // NOTE: Currently only reachable from InitImageMethodVisitor for the app image case.
967  return !GetCompilerOptions().IsBootImage();
968}
969
970bool CompilerDriver::IsClassToCompile(const char* descriptor) const {
971  if (classes_to_compile_ == nullptr) {
972    return true;
973  }
974  return classes_to_compile_->find(descriptor) != classes_to_compile_->end();
975}
976
977bool CompilerDriver::IsMethodToCompile(const MethodReference& method_ref) const {
978  if (methods_to_compile_ == nullptr) {
979    return true;
980  }
981
982  std::string tmp = method_ref.PrettyMethod();
983  return methods_to_compile_->find(tmp.c_str()) != methods_to_compile_->end();
984}
985
986bool CompilerDriver::ShouldCompileBasedOnProfile(const MethodReference& method_ref) const {
987  // Profile compilation info may be null if no profile is passed.
988  if (!CompilerFilter::DependsOnProfile(compiler_options_->GetCompilerFilter())) {
989    // Use the compiler filter instead of the presence of profile_compilation_info_ since
990    // we may want to have full speed compilation along with profile based layout optimizations.
991    return true;
992  }
993  // If we are using a profile filter but do not have a profile compilation info, compile nothing.
994  if (profile_compilation_info_ == nullptr) {
995    return false;
996  }
997  // Compile only hot methods, it is the profile saver's job to decide what startup methods to mark
998  // as hot.
999  bool result = profile_compilation_info_->GetMethodHotness(method_ref).IsHot();
1000
1001  if (kDebugProfileGuidedCompilation) {
1002    LOG(INFO) << "[ProfileGuidedCompilation] "
1003        << (result ? "Compiled" : "Skipped") << " method:" << method_ref.PrettyMethod(true);
1004  }
1005  return result;
1006}
1007
1008class ResolveCatchBlockExceptionsClassVisitor : public ClassVisitor {
1009 public:
1010  ResolveCatchBlockExceptionsClassVisitor() : classes_() {}
1011
1012  virtual bool operator()(ObjPtr<mirror::Class> c) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
1013    classes_.push_back(c);
1014    return true;
1015  }
1016
1017  void FindExceptionTypesToResolve(
1018      std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve)
1019      REQUIRES_SHARED(Locks::mutator_lock_) {
1020    const auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
1021    for (ObjPtr<mirror::Class> klass : classes_) {
1022      for (ArtMethod& method : klass->GetMethods(pointer_size)) {
1023        FindExceptionTypesToResolveForMethod(&method, exceptions_to_resolve);
1024      }
1025    }
1026  }
1027
1028 private:
1029  void FindExceptionTypesToResolveForMethod(
1030      ArtMethod* method,
1031      std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve)
1032      REQUIRES_SHARED(Locks::mutator_lock_) {
1033    if (method->GetCodeItem() == nullptr) {
1034      return;  // native or abstract method
1035    }
1036    CodeItemDataAccessor accessor(method->DexInstructionData());
1037    if (accessor.TriesSize() == 0) {
1038      return;  // nothing to process
1039    }
1040    const uint8_t* encoded_catch_handler_list = accessor.GetCatchHandlerData();
1041    size_t num_encoded_catch_handlers = DecodeUnsignedLeb128(&encoded_catch_handler_list);
1042    for (size_t i = 0; i < num_encoded_catch_handlers; i++) {
1043      int32_t encoded_catch_handler_size = DecodeSignedLeb128(&encoded_catch_handler_list);
1044      bool has_catch_all = false;
1045      if (encoded_catch_handler_size <= 0) {
1046        encoded_catch_handler_size = -encoded_catch_handler_size;
1047        has_catch_all = true;
1048      }
1049      for (int32_t j = 0; j < encoded_catch_handler_size; j++) {
1050        dex::TypeIndex encoded_catch_handler_handlers_type_idx =
1051            dex::TypeIndex(DecodeUnsignedLeb128(&encoded_catch_handler_list));
1052        // Add to set of types to resolve if not already in the dex cache resolved types
1053        if (!method->IsResolvedTypeIdx(encoded_catch_handler_handlers_type_idx)) {
1054          exceptions_to_resolve->emplace(encoded_catch_handler_handlers_type_idx,
1055                                         method->GetDexFile());
1056        }
1057        // ignore address associated with catch handler
1058        DecodeUnsignedLeb128(&encoded_catch_handler_list);
1059      }
1060      if (has_catch_all) {
1061        // ignore catch all address
1062        DecodeUnsignedLeb128(&encoded_catch_handler_list);
1063      }
1064    }
1065  }
1066
1067  std::vector<ObjPtr<mirror::Class>> classes_;
1068};
1069
1070class RecordImageClassesVisitor : public ClassVisitor {
1071 public:
1072  explicit RecordImageClassesVisitor(std::unordered_set<std::string>* image_classes)
1073      : image_classes_(image_classes) {}
1074
1075  bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
1076    std::string temp;
1077    image_classes_->insert(klass->GetDescriptor(&temp));
1078    return true;
1079  }
1080
1081 private:
1082  std::unordered_set<std::string>* const image_classes_;
1083};
1084
1085// Make a list of descriptors for classes to include in the image
1086void CompilerDriver::LoadImageClasses(TimingLogger* timings) {
1087  CHECK(timings != nullptr);
1088  if (!GetCompilerOptions().IsBootImage()) {
1089    return;
1090  }
1091
1092  TimingLogger::ScopedTiming t("LoadImageClasses", timings);
1093  // Make a first class to load all classes explicitly listed in the file
1094  Thread* self = Thread::Current();
1095  ScopedObjectAccess soa(self);
1096  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1097  CHECK(image_classes_.get() != nullptr);
1098  for (auto it = image_classes_->begin(), end = image_classes_->end(); it != end;) {
1099    const std::string& descriptor(*it);
1100    StackHandleScope<1> hs(self);
1101    Handle<mirror::Class> klass(
1102        hs.NewHandle(class_linker->FindSystemClass(self, descriptor.c_str())));
1103    if (klass == nullptr) {
1104      VLOG(compiler) << "Failed to find class " << descriptor;
1105      image_classes_->erase(it++);
1106      self->ClearException();
1107    } else {
1108      ++it;
1109    }
1110  }
1111
1112  // Resolve exception classes referenced by the loaded classes. The catch logic assumes
1113  // exceptions are resolved by the verifier when there is a catch block in an interested method.
1114  // Do this here so that exception classes appear to have been specified image classes.
1115  std::set<std::pair<dex::TypeIndex, const DexFile*>> unresolved_exception_types;
1116  StackHandleScope<1> hs(self);
1117  Handle<mirror::Class> java_lang_Throwable(
1118      hs.NewHandle(class_linker->FindSystemClass(self, "Ljava/lang/Throwable;")));
1119  do {
1120    unresolved_exception_types.clear();
1121    {
1122      // Thread suspension is not allowed while ResolveCatchBlockExceptionsClassVisitor
1123      // is using a std::vector<ObjPtr<mirror::Class>>.
1124      ScopedAssertNoThreadSuspension ants(__FUNCTION__);
1125      ResolveCatchBlockExceptionsClassVisitor visitor;
1126      class_linker->VisitClasses(&visitor);
1127      visitor.FindExceptionTypesToResolve(&unresolved_exception_types);
1128    }
1129    for (const auto& exception_type : unresolved_exception_types) {
1130      dex::TypeIndex exception_type_idx = exception_type.first;
1131      const DexFile* dex_file = exception_type.second;
1132      StackHandleScope<1> hs2(self);
1133      Handle<mirror::DexCache> dex_cache(hs2.NewHandle(class_linker->RegisterDexFile(*dex_file,
1134                                                                                     nullptr)));
1135      ObjPtr<mirror::Class> klass =
1136          (dex_cache != nullptr)
1137              ? class_linker->ResolveType(exception_type_idx,
1138                                          dex_cache,
1139                                          ScopedNullHandle<mirror::ClassLoader>())
1140              : nullptr;
1141      if (klass == nullptr) {
1142        const DexFile::TypeId& type_id = dex_file->GetTypeId(exception_type_idx);
1143        const char* descriptor = dex_file->GetTypeDescriptor(type_id);
1144        LOG(FATAL) << "Failed to resolve class " << descriptor;
1145      }
1146      DCHECK(java_lang_Throwable->IsAssignableFrom(klass));
1147    }
1148    // Resolving exceptions may load classes that reference more exceptions, iterate until no
1149    // more are found
1150  } while (!unresolved_exception_types.empty());
1151
1152  // We walk the roots looking for classes so that we'll pick up the
1153  // above classes plus any classes them depend on such super
1154  // classes, interfaces, and the required ClassLinker roots.
1155  RecordImageClassesVisitor visitor(image_classes_.get());
1156  class_linker->VisitClasses(&visitor);
1157
1158  CHECK_NE(image_classes_->size(), 0U);
1159}
1160
1161static void MaybeAddToImageClasses(Thread* self,
1162                                   ObjPtr<mirror::Class> klass,
1163                                   std::unordered_set<std::string>* image_classes)
1164    REQUIRES_SHARED(Locks::mutator_lock_) {
1165  DCHECK_EQ(self, Thread::Current());
1166  StackHandleScope<1> hs(self);
1167  std::string temp;
1168  const PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
1169  while (!klass->IsObjectClass()) {
1170    const char* descriptor = klass->GetDescriptor(&temp);
1171    std::pair<std::unordered_set<std::string>::iterator, bool> result =
1172        image_classes->insert(descriptor);
1173    if (!result.second) {  // Previously inserted.
1174      break;
1175    }
1176    VLOG(compiler) << "Adding " << descriptor << " to image classes";
1177    for (size_t i = 0, num_interfaces = klass->NumDirectInterfaces(); i != num_interfaces; ++i) {
1178      ObjPtr<mirror::Class> interface = mirror::Class::GetDirectInterface(self, klass, i);
1179      DCHECK(interface != nullptr);
1180      MaybeAddToImageClasses(self, interface, image_classes);
1181    }
1182    for (auto& m : klass->GetVirtualMethods(pointer_size)) {
1183      MaybeAddToImageClasses(self, m.GetDeclaringClass(), image_classes);
1184    }
1185    if (klass->IsArrayClass()) {
1186      MaybeAddToImageClasses(self, klass->GetComponentType(), image_classes);
1187    }
1188    klass.Assign(klass->GetSuperClass());
1189  }
1190}
1191
1192// Keeps all the data for the update together. Also doubles as the reference visitor.
1193// Note: we can use object pointers because we suspend all threads.
1194class ClinitImageUpdate {
1195 public:
1196  static ClinitImageUpdate* Create(VariableSizedHandleScope& hs,
1197                                   std::unordered_set<std::string>* image_class_descriptors,
1198                                   Thread* self,
1199                                   ClassLinker* linker) {
1200    std::unique_ptr<ClinitImageUpdate> res(new ClinitImageUpdate(hs,
1201                                                                 image_class_descriptors,
1202                                                                 self,
1203                                                                 linker));
1204    return res.release();
1205  }
1206
1207  ~ClinitImageUpdate() {
1208    // Allow others to suspend again.
1209    self_->EndAssertNoThreadSuspension(old_cause_);
1210  }
1211
1212  // Visitor for VisitReferences.
1213  void operator()(ObjPtr<mirror::Object> object,
1214                  MemberOffset field_offset,
1215                  bool /* is_static */) const
1216      REQUIRES_SHARED(Locks::mutator_lock_) {
1217    mirror::Object* ref = object->GetFieldObject<mirror::Object>(field_offset);
1218    if (ref != nullptr) {
1219      VisitClinitClassesObject(ref);
1220    }
1221  }
1222
1223  // java.lang.ref.Reference visitor for VisitReferences.
1224  void operator()(ObjPtr<mirror::Class> klass ATTRIBUTE_UNUSED,
1225                  ObjPtr<mirror::Reference> ref ATTRIBUTE_UNUSED) const {}
1226
1227  // Ignore class native roots.
1228  void VisitRootIfNonNull(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED)
1229      const {}
1230  void VisitRoot(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED) const {}
1231
1232  void Walk() REQUIRES_SHARED(Locks::mutator_lock_) {
1233    // Use the initial classes as roots for a search.
1234    for (Handle<mirror::Class> klass_root : image_classes_) {
1235      VisitClinitClassesObject(klass_root.Get());
1236    }
1237    Thread* self = Thread::Current();
1238    ScopedAssertNoThreadSuspension ants(__FUNCTION__);
1239    for (Handle<mirror::Class> h_klass : to_insert_) {
1240      MaybeAddToImageClasses(self, h_klass.Get(), image_class_descriptors_);
1241    }
1242  }
1243
1244 private:
1245  class FindImageClassesVisitor : public ClassVisitor {
1246   public:
1247    explicit FindImageClassesVisitor(VariableSizedHandleScope& hs,
1248                                     ClinitImageUpdate* data)
1249        : data_(data),
1250          hs_(hs) {}
1251
1252    bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
1253      std::string temp;
1254      const char* name = klass->GetDescriptor(&temp);
1255      if (data_->image_class_descriptors_->find(name) != data_->image_class_descriptors_->end()) {
1256        data_->image_classes_.push_back(hs_.NewHandle(klass));
1257      } else {
1258        // Check whether it is initialized and has a clinit. They must be kept, too.
1259        if (klass->IsInitialized() && klass->FindClassInitializer(
1260            Runtime::Current()->GetClassLinker()->GetImagePointerSize()) != nullptr) {
1261          data_->image_classes_.push_back(hs_.NewHandle(klass));
1262        }
1263      }
1264      return true;
1265    }
1266
1267   private:
1268    ClinitImageUpdate* const data_;
1269    VariableSizedHandleScope& hs_;
1270  };
1271
1272  ClinitImageUpdate(VariableSizedHandleScope& hs,
1273                    std::unordered_set<std::string>* image_class_descriptors,
1274                    Thread* self,
1275                    ClassLinker* linker) REQUIRES_SHARED(Locks::mutator_lock_)
1276      : hs_(hs),
1277        image_class_descriptors_(image_class_descriptors),
1278        self_(self) {
1279    CHECK(linker != nullptr);
1280    CHECK(image_class_descriptors != nullptr);
1281
1282    // Make sure nobody interferes with us.
1283    old_cause_ = self->StartAssertNoThreadSuspension("Boot image closure");
1284
1285    // Find all the already-marked classes.
1286    WriterMutexLock mu(self, *Locks::heap_bitmap_lock_);
1287    FindImageClassesVisitor visitor(hs_, this);
1288    linker->VisitClasses(&visitor);
1289  }
1290
1291  void VisitClinitClassesObject(mirror::Object* object) const
1292      REQUIRES_SHARED(Locks::mutator_lock_) {
1293    DCHECK(object != nullptr);
1294    if (marked_objects_.find(object) != marked_objects_.end()) {
1295      // Already processed.
1296      return;
1297    }
1298
1299    // Mark it.
1300    marked_objects_.insert(object);
1301
1302    if (object->IsClass()) {
1303      // Add to the TODO list since MaybeAddToImageClasses may cause thread suspension. Thread
1304      // suspensionb is not safe to do in VisitObjects or VisitReferences.
1305      to_insert_.push_back(hs_.NewHandle(object->AsClass()));
1306    } else {
1307      // Else visit the object's class.
1308      VisitClinitClassesObject(object->GetClass());
1309    }
1310
1311    // If it is not a DexCache, visit all references.
1312    if (!object->IsDexCache()) {
1313      object->VisitReferences(*this, *this);
1314    }
1315  }
1316
1317  VariableSizedHandleScope& hs_;
1318  mutable std::vector<Handle<mirror::Class>> to_insert_;
1319  mutable std::unordered_set<mirror::Object*> marked_objects_;
1320  std::unordered_set<std::string>* const image_class_descriptors_;
1321  std::vector<Handle<mirror::Class>> image_classes_;
1322  Thread* const self_;
1323  const char* old_cause_;
1324
1325  DISALLOW_COPY_AND_ASSIGN(ClinitImageUpdate);
1326};
1327
1328void CompilerDriver::UpdateImageClasses(TimingLogger* timings) {
1329  if (GetCompilerOptions().IsBootImage()) {
1330    TimingLogger::ScopedTiming t("UpdateImageClasses", timings);
1331
1332    Runtime* runtime = Runtime::Current();
1333
1334    // Suspend all threads.
1335    ScopedSuspendAll ssa(__FUNCTION__);
1336
1337    VariableSizedHandleScope hs(Thread::Current());
1338    std::string error_msg;
1339    std::unique_ptr<ClinitImageUpdate> update(ClinitImageUpdate::Create(hs,
1340                                                                        image_classes_.get(),
1341                                                                        Thread::Current(),
1342                                                                        runtime->GetClassLinker()));
1343
1344    // Do the marking.
1345    update->Walk();
1346  }
1347}
1348
1349bool CompilerDriver::CanAssumeClassIsLoaded(mirror::Class* klass) {
1350  Runtime* runtime = Runtime::Current();
1351  if (!runtime->IsAotCompiler()) {
1352    DCHECK(runtime->UseJitCompilation());
1353    // Having the klass reference here implies that the klass is already loaded.
1354    return true;
1355  }
1356  if (!GetCompilerOptions().IsBootImage()) {
1357    // Assume loaded only if klass is in the boot image. App classes cannot be assumed
1358    // loaded because we don't even know what class loader will be used to load them.
1359    bool class_in_image = runtime->GetHeap()->FindSpaceFromObject(klass, false)->IsImageSpace();
1360    return class_in_image;
1361  }
1362  std::string temp;
1363  const char* descriptor = klass->GetDescriptor(&temp);
1364  return IsImageClass(descriptor);
1365}
1366
1367bool CompilerDriver::CanAccessTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class,
1368                                                ObjPtr<mirror::Class> resolved_class) {
1369  if (resolved_class == nullptr) {
1370    stats_->TypeNeedsAccessCheck();
1371    return false;  // Unknown class needs access checks.
1372  }
1373  bool is_accessible = resolved_class->IsPublic();  // Public classes are always accessible.
1374  if (!is_accessible) {
1375    if (referrer_class == nullptr) {
1376      stats_->TypeNeedsAccessCheck();
1377      return false;  // Incomplete referrer knowledge needs access check.
1378    }
1379    // Perform access check, will return true if access is ok or false if we're going to have to
1380    // check this at runtime (for example for class loaders).
1381    is_accessible = referrer_class->CanAccess(resolved_class);
1382  }
1383  if (is_accessible) {
1384    stats_->TypeDoesntNeedAccessCheck();
1385  } else {
1386    stats_->TypeNeedsAccessCheck();
1387  }
1388  return is_accessible;
1389}
1390
1391bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class,
1392                                                            ObjPtr<mirror::Class> resolved_class,
1393                                                            bool* finalizable) {
1394  if (resolved_class == nullptr) {
1395    stats_->TypeNeedsAccessCheck();
1396    // Be conservative.
1397    *finalizable = true;
1398    return false;  // Unknown class needs access checks.
1399  }
1400  *finalizable = resolved_class->IsFinalizable();
1401  bool is_accessible = resolved_class->IsPublic();  // Public classes are always accessible.
1402  if (!is_accessible) {
1403    if (referrer_class == nullptr) {
1404      stats_->TypeNeedsAccessCheck();
1405      return false;  // Incomplete referrer knowledge needs access check.
1406    }
1407    // Perform access and instantiable checks, will return true if access is ok or false if we're
1408    // going to have to check this at runtime (for example for class loaders).
1409    is_accessible = referrer_class->CanAccess(resolved_class);
1410  }
1411  bool result = is_accessible && resolved_class->IsInstantiable();
1412  if (result) {
1413    stats_->TypeDoesntNeedAccessCheck();
1414  } else {
1415    stats_->TypeNeedsAccessCheck();
1416  }
1417  return result;
1418}
1419
1420void CompilerDriver::ProcessedInstanceField(bool resolved) {
1421  if (!resolved) {
1422    stats_->UnresolvedInstanceField();
1423  } else {
1424    stats_->ResolvedInstanceField();
1425  }
1426}
1427
1428void CompilerDriver::ProcessedStaticField(bool resolved, bool local) {
1429  if (!resolved) {
1430    stats_->UnresolvedStaticField();
1431  } else if (local) {
1432    stats_->ResolvedLocalStaticField();
1433  } else {
1434    stats_->ResolvedStaticField();
1435  }
1436}
1437
1438ArtField* CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx,
1439                                                   const DexCompilationUnit* mUnit,
1440                                                   bool is_put,
1441                                                   const ScopedObjectAccess& soa) {
1442  // Try to resolve the field and compiling method's class.
1443  ArtField* resolved_field;
1444  ObjPtr<mirror::Class> referrer_class;
1445  Handle<mirror::DexCache> dex_cache(mUnit->GetDexCache());
1446  {
1447    Handle<mirror::ClassLoader> class_loader = mUnit->GetClassLoader();
1448    resolved_field = ResolveField(soa, dex_cache, class_loader, field_idx, /* is_static */ false);
1449    referrer_class = resolved_field != nullptr
1450        ? ResolveCompilingMethodsClass(soa, dex_cache, class_loader, mUnit) : nullptr;
1451  }
1452  bool can_link = false;
1453  if (resolved_field != nullptr && referrer_class != nullptr) {
1454    std::pair<bool, bool> fast_path = IsFastInstanceField(
1455        dex_cache.Get(), referrer_class, resolved_field, field_idx);
1456    can_link = is_put ? fast_path.second : fast_path.first;
1457  }
1458  ProcessedInstanceField(can_link);
1459  return can_link ? resolved_field : nullptr;
1460}
1461
1462bool CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit,
1463                                              bool is_put, MemberOffset* field_offset,
1464                                              bool* is_volatile) {
1465  ScopedObjectAccess soa(Thread::Current());
1466  ArtField* resolved_field = ComputeInstanceFieldInfo(field_idx, mUnit, is_put, soa);
1467
1468  if (resolved_field == nullptr) {
1469    // Conservative defaults.
1470    *is_volatile = true;
1471    *field_offset = MemberOffset(static_cast<size_t>(-1));
1472    return false;
1473  } else {
1474    *is_volatile = resolved_field->IsVolatile();
1475    *field_offset = resolved_field->GetOffset();
1476    return true;
1477  }
1478}
1479
1480const VerifiedMethod* CompilerDriver::GetVerifiedMethod(const DexFile* dex_file,
1481                                                        uint32_t method_idx) const {
1482  MethodReference ref(dex_file, method_idx);
1483  return verification_results_->GetVerifiedMethod(ref);
1484}
1485
1486bool CompilerDriver::IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc) {
1487  if (!compiler_options_->IsVerificationEnabled()) {
1488    // If we didn't verify, every cast has to be treated as non-safe.
1489    return false;
1490  }
1491  DCHECK(mUnit->GetVerifiedMethod() != nullptr);
1492  bool result = mUnit->GetVerifiedMethod()->IsSafeCast(dex_pc);
1493  if (result) {
1494    stats_->SafeCast();
1495  } else {
1496    stats_->NotASafeCast();
1497  }
1498  return result;
1499}
1500
1501class CompilationVisitor {
1502 public:
1503  virtual ~CompilationVisitor() {}
1504  virtual void Visit(size_t index) = 0;
1505};
1506
1507class ParallelCompilationManager {
1508 public:
1509  ParallelCompilationManager(ClassLinker* class_linker,
1510                             jobject class_loader,
1511                             CompilerDriver* compiler,
1512                             const DexFile* dex_file,
1513                             const std::vector<const DexFile*>& dex_files,
1514                             ThreadPool* thread_pool)
1515    : index_(0),
1516      class_linker_(class_linker),
1517      class_loader_(class_loader),
1518      compiler_(compiler),
1519      dex_file_(dex_file),
1520      dex_files_(dex_files),
1521      thread_pool_(thread_pool) {}
1522
1523  ClassLinker* GetClassLinker() const {
1524    CHECK(class_linker_ != nullptr);
1525    return class_linker_;
1526  }
1527
1528  jobject GetClassLoader() const {
1529    return class_loader_;
1530  }
1531
1532  CompilerDriver* GetCompiler() const {
1533    CHECK(compiler_ != nullptr);
1534    return compiler_;
1535  }
1536
1537  const DexFile* GetDexFile() const {
1538    CHECK(dex_file_ != nullptr);
1539    return dex_file_;
1540  }
1541
1542  const std::vector<const DexFile*>& GetDexFiles() const {
1543    return dex_files_;
1544  }
1545
1546  void ForAll(size_t begin, size_t end, CompilationVisitor* visitor, size_t work_units)
1547      REQUIRES(!*Locks::mutator_lock_) {
1548    ForAllLambda(begin, end, [visitor](size_t index) { visitor->Visit(index); }, work_units);
1549  }
1550
1551  template <typename Fn>
1552  void ForAllLambda(size_t begin, size_t end, Fn fn, size_t work_units)
1553      REQUIRES(!*Locks::mutator_lock_) {
1554    Thread* self = Thread::Current();
1555    self->AssertNoPendingException();
1556    CHECK_GT(work_units, 0U);
1557
1558    index_.StoreRelaxed(begin);
1559    for (size_t i = 0; i < work_units; ++i) {
1560      thread_pool_->AddTask(self, new ForAllClosureLambda<Fn>(this, end, fn));
1561    }
1562    thread_pool_->StartWorkers(self);
1563
1564    // Ensure we're suspended while we're blocked waiting for the other threads to finish (worker
1565    // thread destructor's called below perform join).
1566    CHECK_NE(self->GetState(), kRunnable);
1567
1568    // Wait for all the worker threads to finish.
1569    thread_pool_->Wait(self, true, false);
1570
1571    // And stop the workers accepting jobs.
1572    thread_pool_->StopWorkers(self);
1573  }
1574
1575  size_t NextIndex() {
1576    return index_.FetchAndAddSequentiallyConsistent(1);
1577  }
1578
1579 private:
1580  template <typename Fn>
1581  class ForAllClosureLambda : public Task {
1582   public:
1583    ForAllClosureLambda(ParallelCompilationManager* manager, size_t end, Fn fn)
1584        : manager_(manager),
1585          end_(end),
1586          fn_(fn) {}
1587
1588    void Run(Thread* self) OVERRIDE {
1589      while (true) {
1590        const size_t index = manager_->NextIndex();
1591        if (UNLIKELY(index >= end_)) {
1592          break;
1593        }
1594        fn_(index);
1595        self->AssertNoPendingException();
1596      }
1597    }
1598
1599    void Finalize() OVERRIDE {
1600      delete this;
1601    }
1602
1603   private:
1604    ParallelCompilationManager* const manager_;
1605    const size_t end_;
1606    Fn fn_;
1607  };
1608
1609  AtomicInteger index_;
1610  ClassLinker* const class_linker_;
1611  const jobject class_loader_;
1612  CompilerDriver* const compiler_;
1613  const DexFile* const dex_file_;
1614  const std::vector<const DexFile*>& dex_files_;
1615  ThreadPool* const thread_pool_;
1616
1617  DISALLOW_COPY_AND_ASSIGN(ParallelCompilationManager);
1618};
1619
1620// A fast version of SkipClass above if the class pointer is available
1621// that avoids the expensive FindInClassPath search.
1622static bool SkipClass(jobject class_loader, const DexFile& dex_file, ObjPtr<mirror::Class> klass)
1623    REQUIRES_SHARED(Locks::mutator_lock_) {
1624  DCHECK(klass != nullptr);
1625  const DexFile& original_dex_file = *klass->GetDexCache()->GetDexFile();
1626  if (&dex_file != &original_dex_file) {
1627    if (class_loader == nullptr) {
1628      LOG(WARNING) << "Skipping class " << klass->PrettyDescriptor() << " from "
1629                   << dex_file.GetLocation() << " previously found in "
1630                   << original_dex_file.GetLocation();
1631    }
1632    return true;
1633  }
1634  return false;
1635}
1636
1637static void CheckAndClearResolveException(Thread* self)
1638    REQUIRES_SHARED(Locks::mutator_lock_) {
1639  CHECK(self->IsExceptionPending());
1640  mirror::Throwable* exception = self->GetException();
1641  std::string temp;
1642  const char* descriptor = exception->GetClass()->GetDescriptor(&temp);
1643  const char* expected_exceptions[] = {
1644      "Ljava/lang/IllegalAccessError;",
1645      "Ljava/lang/IncompatibleClassChangeError;",
1646      "Ljava/lang/InstantiationError;",
1647      "Ljava/lang/LinkageError;",
1648      "Ljava/lang/NoClassDefFoundError;",
1649      "Ljava/lang/NoSuchFieldError;",
1650      "Ljava/lang/NoSuchMethodError;"
1651  };
1652  bool found = false;
1653  for (size_t i = 0; (found == false) && (i < arraysize(expected_exceptions)); ++i) {
1654    if (strcmp(descriptor, expected_exceptions[i]) == 0) {
1655      found = true;
1656    }
1657  }
1658  if (!found) {
1659    LOG(FATAL) << "Unexpected exception " << exception->Dump();
1660  }
1661  self->ClearException();
1662}
1663
1664bool CompilerDriver::RequiresConstructorBarrier(const DexFile& dex_file,
1665                                                uint16_t class_def_idx) const {
1666  const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_idx);
1667  const uint8_t* class_data = dex_file.GetClassData(class_def);
1668  if (class_data == nullptr) {
1669    // Empty class such as a marker interface.
1670    return false;
1671  }
1672  ClassDataItemIterator it(dex_file, class_data);
1673  it.SkipStaticFields();
1674  // We require a constructor barrier if there are final instance fields.
1675  while (it.HasNextInstanceField()) {
1676    if (it.MemberIsFinal()) {
1677      return true;
1678    }
1679    it.Next();
1680  }
1681  return false;
1682}
1683
1684class ResolveClassFieldsAndMethodsVisitor : public CompilationVisitor {
1685 public:
1686  explicit ResolveClassFieldsAndMethodsVisitor(const ParallelCompilationManager* manager)
1687      : manager_(manager) {}
1688
1689  void Visit(size_t class_def_index) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
1690    ScopedTrace trace(__FUNCTION__);
1691    Thread* const self = Thread::Current();
1692    jobject jclass_loader = manager_->GetClassLoader();
1693    const DexFile& dex_file = *manager_->GetDexFile();
1694    ClassLinker* class_linker = manager_->GetClassLinker();
1695
1696    // If an instance field is final then we need to have a barrier on the return, static final
1697    // fields are assigned within the lock held for class initialization. Conservatively assume
1698    // constructor barriers are always required.
1699    bool requires_constructor_barrier = true;
1700
1701    // Method and Field are the worst. We can't resolve without either
1702    // context from the code use (to disambiguate virtual vs direct
1703    // method and instance vs static field) or from class
1704    // definitions. While the compiler will resolve what it can as it
1705    // needs it, here we try to resolve fields and methods used in class
1706    // definitions, since many of them many never be referenced by
1707    // generated code.
1708    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
1709    ScopedObjectAccess soa(self);
1710    StackHandleScope<2> hs(soa.Self());
1711    Handle<mirror::ClassLoader> class_loader(
1712        hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
1713    Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
1714        soa.Self(), dex_file)));
1715    // Resolve the class.
1716    ObjPtr<mirror::Class> klass =
1717        class_linker->ResolveType(class_def.class_idx_, dex_cache, class_loader);
1718    bool resolve_fields_and_methods;
1719    if (klass == nullptr) {
1720      // Class couldn't be resolved, for example, super-class is in a different dex file. Don't
1721      // attempt to resolve methods and fields when there is no declaring class.
1722      CheckAndClearResolveException(soa.Self());
1723      resolve_fields_and_methods = false;
1724    } else {
1725      // We successfully resolved a class, should we skip it?
1726      if (SkipClass(jclass_loader, dex_file, klass)) {
1727        return;
1728      }
1729      // We want to resolve the methods and fields eagerly.
1730      resolve_fields_and_methods = true;
1731    }
1732    // Note the class_data pointer advances through the headers,
1733    // static fields, instance fields, direct methods, and virtual
1734    // methods.
1735    const uint8_t* class_data = dex_file.GetClassData(class_def);
1736    if (class_data == nullptr) {
1737      // Empty class such as a marker interface.
1738      requires_constructor_barrier = false;
1739    } else {
1740      ClassDataItemIterator it(dex_file, class_data);
1741      while (it.HasNextStaticField()) {
1742        if (resolve_fields_and_methods) {
1743          ArtField* field = class_linker->ResolveField(
1744              it.GetMemberIndex(), dex_cache, class_loader, /* is_static */ true);
1745          if (field == nullptr) {
1746            CheckAndClearResolveException(soa.Self());
1747          }
1748        }
1749        it.Next();
1750      }
1751      // We require a constructor barrier if there are final instance fields.
1752      requires_constructor_barrier = false;
1753      while (it.HasNextInstanceField()) {
1754        if (it.MemberIsFinal()) {
1755          requires_constructor_barrier = true;
1756        }
1757        if (resolve_fields_and_methods) {
1758          ArtField* field = class_linker->ResolveField(
1759              it.GetMemberIndex(), dex_cache, class_loader, /* is_static */ false);
1760          if (field == nullptr) {
1761            CheckAndClearResolveException(soa.Self());
1762          }
1763        }
1764        it.Next();
1765      }
1766      if (resolve_fields_and_methods) {
1767        while (it.HasNextMethod()) {
1768          ArtMethod* method = class_linker->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>(
1769              it.GetMemberIndex(),
1770              dex_cache,
1771              class_loader,
1772              /* referrer */ nullptr,
1773              it.GetMethodInvokeType(class_def));
1774          if (method == nullptr) {
1775            CheckAndClearResolveException(soa.Self());
1776          }
1777          it.Next();
1778        }
1779        DCHECK(!it.HasNext());
1780      }
1781    }
1782    manager_->GetCompiler()->SetRequiresConstructorBarrier(self,
1783                                                           &dex_file,
1784                                                           class_def_index,
1785                                                           requires_constructor_barrier);
1786  }
1787
1788 private:
1789  const ParallelCompilationManager* const manager_;
1790};
1791
1792class ResolveTypeVisitor : public CompilationVisitor {
1793 public:
1794  explicit ResolveTypeVisitor(const ParallelCompilationManager* manager) : manager_(manager) {
1795  }
1796  void Visit(size_t type_idx) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
1797  // Class derived values are more complicated, they require the linker and loader.
1798    ScopedObjectAccess soa(Thread::Current());
1799    ClassLinker* class_linker = manager_->GetClassLinker();
1800    const DexFile& dex_file = *manager_->GetDexFile();
1801    StackHandleScope<2> hs(soa.Self());
1802    Handle<mirror::ClassLoader> class_loader(
1803        hs.NewHandle(soa.Decode<mirror::ClassLoader>(manager_->GetClassLoader())));
1804    Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->RegisterDexFile(
1805        dex_file,
1806        class_loader.Get())));
1807    ObjPtr<mirror::Class> klass = (dex_cache != nullptr)
1808        ? class_linker->ResolveType(dex::TypeIndex(type_idx), dex_cache, class_loader)
1809        : nullptr;
1810
1811    if (klass == nullptr) {
1812      soa.Self()->AssertPendingException();
1813      mirror::Throwable* exception = soa.Self()->GetException();
1814      VLOG(compiler) << "Exception during type resolution: " << exception->Dump();
1815      if (exception->GetClass()->DescriptorEquals("Ljava/lang/OutOfMemoryError;")) {
1816        // There's little point continuing compilation if the heap is exhausted.
1817        LOG(FATAL) << "Out of memory during type resolution for compilation";
1818      }
1819      soa.Self()->ClearException();
1820    }
1821  }
1822
1823 private:
1824  const ParallelCompilationManager* const manager_;
1825};
1826
1827void CompilerDriver::ResolveDexFile(jobject class_loader,
1828                                    const DexFile& dex_file,
1829                                    const std::vector<const DexFile*>& dex_files,
1830                                    ThreadPool* thread_pool,
1831                                    size_t thread_count,
1832                                    TimingLogger* timings) {
1833  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1834
1835  // TODO: we could resolve strings here, although the string table is largely filled with class
1836  //       and method names.
1837
1838  ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
1839                                     thread_pool);
1840  if (GetCompilerOptions().IsBootImage()) {
1841    // For images we resolve all types, such as array, whereas for applications just those with
1842    // classdefs are resolved by ResolveClassFieldsAndMethods.
1843    TimingLogger::ScopedTiming t("Resolve Types", timings);
1844    ResolveTypeVisitor visitor(&context);
1845    context.ForAll(0, dex_file.NumTypeIds(), &visitor, thread_count);
1846  }
1847
1848  TimingLogger::ScopedTiming t("Resolve MethodsAndFields", timings);
1849  ResolveClassFieldsAndMethodsVisitor visitor(&context);
1850  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
1851}
1852
1853void CompilerDriver::SetVerified(jobject class_loader,
1854                                 const std::vector<const DexFile*>& dex_files,
1855                                 TimingLogger* timings) {
1856  // This can be run in parallel.
1857  for (const DexFile* dex_file : dex_files) {
1858    CHECK(dex_file != nullptr);
1859    SetVerifiedDexFile(class_loader,
1860                       *dex_file,
1861                       dex_files,
1862                       parallel_thread_pool_.get(),
1863                       parallel_thread_count_,
1864                       timings);
1865  }
1866}
1867
1868static void PopulateVerifiedMethods(const DexFile& dex_file,
1869                                    uint32_t class_def_index,
1870                                    VerificationResults* verification_results) {
1871  const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
1872  const uint8_t* class_data = dex_file.GetClassData(class_def);
1873  if (class_data == nullptr) {
1874    return;
1875  }
1876  ClassDataItemIterator it(dex_file, class_data);
1877  it.SkipAllFields();
1878
1879  while (it.HasNextMethod()) {
1880    verification_results->CreateVerifiedMethodFor(MethodReference(&dex_file, it.GetMemberIndex()));
1881    it.Next();
1882  }
1883  DCHECK(!it.HasNext());
1884}
1885
1886static void LoadAndUpdateStatus(const DexFile& dex_file,
1887                                const DexFile::ClassDef& class_def,
1888                                ClassStatus status,
1889                                Handle<mirror::ClassLoader> class_loader,
1890                                Thread* self)
1891    REQUIRES_SHARED(Locks::mutator_lock_) {
1892  StackHandleScope<1> hs(self);
1893  const char* descriptor = dex_file.GetClassDescriptor(class_def);
1894  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1895  Handle<mirror::Class> cls(hs.NewHandle<mirror::Class>(
1896      class_linker->FindClass(self, descriptor, class_loader)));
1897  if (cls != nullptr) {
1898    // Check that the class is resolved with the current dex file. We might get
1899    // a boot image class, or a class in a different dex file for multidex, and
1900    // we should not update the status in that case.
1901    if (&cls->GetDexFile() == &dex_file) {
1902      ObjectLock<mirror::Class> lock(self, cls);
1903      mirror::Class::SetStatus(cls, status, self);
1904    }
1905  } else {
1906    DCHECK(self->IsExceptionPending());
1907    self->ClearException();
1908  }
1909}
1910
1911bool CompilerDriver::FastVerify(jobject jclass_loader,
1912                                const std::vector<const DexFile*>& dex_files,
1913                                TimingLogger* timings) {
1914  verifier::VerifierDeps* verifier_deps =
1915      Runtime::Current()->GetCompilerCallbacks()->GetVerifierDeps();
1916  // If there exist VerifierDeps that aren't the ones we just created to output, use them to verify.
1917  if (verifier_deps == nullptr || verifier_deps->OutputOnly()) {
1918    return false;
1919  }
1920  TimingLogger::ScopedTiming t("Fast Verify", timings);
1921  ScopedObjectAccess soa(Thread::Current());
1922  StackHandleScope<2> hs(soa.Self());
1923  Handle<mirror::ClassLoader> class_loader(
1924      hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
1925  if (!verifier_deps->ValidateDependencies(class_loader, soa.Self())) {
1926    return false;
1927  }
1928
1929  bool compiler_only_verifies = !GetCompilerOptions().IsAnyCompilationEnabled();
1930
1931  // We successfully validated the dependencies, now update class status
1932  // of verified classes. Note that the dependencies also record which classes
1933  // could not be fully verified; we could try again, but that would hurt verification
1934  // time. So instead we assume these classes still need to be verified at
1935  // runtime.
1936  for (const DexFile* dex_file : dex_files) {
1937    // Fetch the list of unverified classes.
1938    const std::set<dex::TypeIndex>& unverified_classes =
1939        verifier_deps->GetUnverifiedClasses(*dex_file);
1940    for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
1941      const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
1942      if (unverified_classes.find(class_def.class_idx_) == unverified_classes.end()) {
1943        if (compiler_only_verifies) {
1944          // Just update the compiled_classes_ map. The compiler doesn't need to resolve
1945          // the type.
1946          ClassReference ref(dex_file, i);
1947          ClassStatus existing = ClassStatus::kNotReady;
1948          DCHECK(compiled_classes_.Get(ref, &existing)) << ref.dex_file->GetLocation();
1949          ClassStateTable::InsertResult result =
1950             compiled_classes_.Insert(ref, existing, ClassStatus::kVerified);
1951          CHECK_EQ(result, ClassStateTable::kInsertResultSuccess);
1952        } else {
1953          // Update the class status, so later compilation stages know they don't need to verify
1954          // the class.
1955          LoadAndUpdateStatus(
1956              *dex_file, class_def, ClassStatus::kVerified, class_loader, soa.Self());
1957          // Create `VerifiedMethod`s for each methods, the compiler expects one for
1958          // quickening or compiling.
1959          // Note that this means:
1960          // - We're only going to compile methods that did verify.
1961          // - Quickening will not do checkcast ellision.
1962          // TODO(ngeoffray): Reconsider this once we refactor compiler filters.
1963          PopulateVerifiedMethods(*dex_file, i, verification_results_);
1964        }
1965      } else if (!compiler_only_verifies) {
1966        // Make sure later compilation stages know they should not try to verify
1967        // this class again.
1968        LoadAndUpdateStatus(*dex_file,
1969                            class_def,
1970                            ClassStatus::kRetryVerificationAtRuntime,
1971                            class_loader,
1972                            soa.Self());
1973      }
1974    }
1975  }
1976  return true;
1977}
1978
1979void CompilerDriver::Verify(jobject jclass_loader,
1980                            const std::vector<const DexFile*>& dex_files,
1981                            TimingLogger* timings) {
1982  if (FastVerify(jclass_loader, dex_files, timings)) {
1983    return;
1984  }
1985
1986  // If there is no existing `verifier_deps` (because of non-existing vdex), or
1987  // the existing `verifier_deps` is not valid anymore, create a new one for
1988  // non boot image compilation. The verifier will need it to record the new dependencies.
1989  // Then dex2oat can update the vdex file with these new dependencies.
1990  if (!GetCompilerOptions().IsBootImage()) {
1991    // Dex2oat creates the verifier deps.
1992    // Create the main VerifierDeps, and set it to this thread.
1993    verifier::VerifierDeps* verifier_deps =
1994        Runtime::Current()->GetCompilerCallbacks()->GetVerifierDeps();
1995    CHECK(verifier_deps != nullptr);
1996    Thread::Current()->SetVerifierDeps(verifier_deps);
1997    // Create per-thread VerifierDeps to avoid contention on the main one.
1998    // We will merge them after verification.
1999    for (ThreadPoolWorker* worker : parallel_thread_pool_->GetWorkers()) {
2000      worker->GetThread()->SetVerifierDeps(new verifier::VerifierDeps(dex_files_for_oat_file_));
2001    }
2002  }
2003
2004  // Verification updates VerifierDeps and needs to run single-threaded to be deterministic.
2005  bool force_determinism = GetCompilerOptions().IsForceDeterminism();
2006  ThreadPool* verify_thread_pool =
2007      force_determinism ? single_thread_pool_.get() : parallel_thread_pool_.get();
2008  size_t verify_thread_count = force_determinism ? 1U : parallel_thread_count_;
2009  for (const DexFile* dex_file : dex_files) {
2010    CHECK(dex_file != nullptr);
2011    VerifyDexFile(jclass_loader,
2012                  *dex_file,
2013                  dex_files,
2014                  verify_thread_pool,
2015                  verify_thread_count,
2016                  timings);
2017  }
2018
2019  if (!GetCompilerOptions().IsBootImage()) {
2020    // Merge all VerifierDeps into the main one.
2021    verifier::VerifierDeps* verifier_deps = Thread::Current()->GetVerifierDeps();
2022    for (ThreadPoolWorker* worker : parallel_thread_pool_->GetWorkers()) {
2023      verifier::VerifierDeps* thread_deps = worker->GetThread()->GetVerifierDeps();
2024      worker->GetThread()->SetVerifierDeps(nullptr);
2025      verifier_deps->MergeWith(*thread_deps, dex_files_for_oat_file_);
2026      delete thread_deps;
2027    }
2028    Thread::Current()->SetVerifierDeps(nullptr);
2029  }
2030}
2031
2032class VerifyClassVisitor : public CompilationVisitor {
2033 public:
2034  VerifyClassVisitor(const ParallelCompilationManager* manager, verifier::HardFailLogMode log_level)
2035     : manager_(manager), log_level_(log_level) {}
2036
2037  virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2038    ScopedTrace trace(__FUNCTION__);
2039    ScopedObjectAccess soa(Thread::Current());
2040    const DexFile& dex_file = *manager_->GetDexFile();
2041    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2042    const char* descriptor = dex_file.GetClassDescriptor(class_def);
2043    ClassLinker* class_linker = manager_->GetClassLinker();
2044    jobject jclass_loader = manager_->GetClassLoader();
2045    StackHandleScope<3> hs(soa.Self());
2046    Handle<mirror::ClassLoader> class_loader(
2047        hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
2048    Handle<mirror::Class> klass(
2049        hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2050    verifier::FailureKind failure_kind;
2051    if (klass == nullptr) {
2052      CHECK(soa.Self()->IsExceptionPending());
2053      soa.Self()->ClearException();
2054
2055      /*
2056       * At compile time, we can still structurally verify the class even if FindClass fails.
2057       * This is to ensure the class is structurally sound for compilation. An unsound class
2058       * will be rejected by the verifier and later skipped during compilation in the compiler.
2059       */
2060      Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
2061          soa.Self(), dex_file)));
2062      std::string error_msg;
2063      failure_kind =
2064          verifier::MethodVerifier::VerifyClass(soa.Self(),
2065                                                &dex_file,
2066                                                dex_cache,
2067                                                class_loader,
2068                                                class_def,
2069                                                Runtime::Current()->GetCompilerCallbacks(),
2070                                                true /* allow soft failures */,
2071                                                log_level_,
2072                                                &error_msg);
2073      if (failure_kind == verifier::FailureKind::kHardFailure) {
2074        LOG(ERROR) << "Verification failed on class " << PrettyDescriptor(descriptor)
2075                   << " because: " << error_msg;
2076        manager_->GetCompiler()->SetHadHardVerifierFailure();
2077      } else if (failure_kind == verifier::FailureKind::kSoftFailure) {
2078        manager_->GetCompiler()->AddSoftVerifierFailure();
2079      } else {
2080        // Force a soft failure for the VerifierDeps. This is a sanity measure, as
2081        // the vdex file already records that the class hasn't been resolved. It avoids
2082        // trying to do future verification optimizations when processing the vdex file.
2083        DCHECK(failure_kind == verifier::FailureKind::kNoFailure) << failure_kind;
2084        failure_kind = verifier::FailureKind::kSoftFailure;
2085      }
2086    } else if (!SkipClass(jclass_loader, dex_file, klass.Get())) {
2087      CHECK(klass->IsResolved()) << klass->PrettyClass();
2088      failure_kind = class_linker->VerifyClass(soa.Self(), klass, log_level_);
2089
2090      if (klass->IsErroneous()) {
2091        // ClassLinker::VerifyClass throws, which isn't useful in the compiler.
2092        CHECK(soa.Self()->IsExceptionPending());
2093        soa.Self()->ClearException();
2094        manager_->GetCompiler()->SetHadHardVerifierFailure();
2095      } else if (failure_kind == verifier::FailureKind::kSoftFailure) {
2096        manager_->GetCompiler()->AddSoftVerifierFailure();
2097      }
2098
2099      CHECK(klass->ShouldVerifyAtRuntime() || klass->IsVerified() || klass->IsErroneous())
2100          << klass->PrettyDescriptor() << ": state=" << klass->GetStatus();
2101
2102      // Class has a meaningful status for the compiler now, record it.
2103      ClassReference ref(manager_->GetDexFile(), class_def_index);
2104      manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
2105
2106      // It is *very* problematic if there are resolution errors in the boot classpath.
2107      //
2108      // It is also bad if classes fail verification. For example, we rely on things working
2109      // OK without verification when the decryption dialog is brought up. It is thus highly
2110      // recommended to compile the boot classpath with
2111      //   --abort-on-hard-verifier-error --abort-on-soft-verifier-error
2112      // which is the default build system configuration.
2113      if (kIsDebugBuild) {
2114        if (manager_->GetCompiler()->GetCompilerOptions().IsBootImage()) {
2115          if (!klass->IsResolved() || klass->IsErroneous()) {
2116            LOG(FATAL) << "Boot classpath class " << klass->PrettyClass()
2117                       << " failed to resolve/is erroneous: state= " << klass->GetStatus();
2118            UNREACHABLE();
2119          }
2120        }
2121        if (klass->IsVerified()) {
2122          DCHECK_EQ(failure_kind, verifier::FailureKind::kNoFailure);
2123        } else if (klass->ShouldVerifyAtRuntime()) {
2124          DCHECK_EQ(failure_kind, verifier::FailureKind::kSoftFailure);
2125        } else {
2126          DCHECK_EQ(failure_kind, verifier::FailureKind::kHardFailure);
2127        }
2128      }
2129    } else {
2130      // Make the skip a soft failure, essentially being considered as verify at runtime.
2131      failure_kind = verifier::FailureKind::kSoftFailure;
2132    }
2133    verifier::VerifierDeps::MaybeRecordVerificationStatus(
2134        dex_file, class_def.class_idx_, failure_kind);
2135    soa.Self()->AssertNoPendingException();
2136  }
2137
2138 private:
2139  const ParallelCompilationManager* const manager_;
2140  const verifier::HardFailLogMode log_level_;
2141};
2142
2143void CompilerDriver::VerifyDexFile(jobject class_loader,
2144                                   const DexFile& dex_file,
2145                                   const std::vector<const DexFile*>& dex_files,
2146                                   ThreadPool* thread_pool,
2147                                   size_t thread_count,
2148                                   TimingLogger* timings) {
2149  TimingLogger::ScopedTiming t("Verify Dex File", timings);
2150  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2151  ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2152                                     thread_pool);
2153  bool abort_on_verifier_failures = GetCompilerOptions().AbortOnHardVerifierFailure()
2154                                    || GetCompilerOptions().AbortOnSoftVerifierFailure();
2155  verifier::HardFailLogMode log_level = abort_on_verifier_failures
2156                              ? verifier::HardFailLogMode::kLogInternalFatal
2157                              : verifier::HardFailLogMode::kLogWarning;
2158  VerifyClassVisitor visitor(&context, log_level);
2159  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
2160}
2161
2162class SetVerifiedClassVisitor : public CompilationVisitor {
2163 public:
2164  explicit SetVerifiedClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2165
2166  virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2167    ScopedTrace trace(__FUNCTION__);
2168    ScopedObjectAccess soa(Thread::Current());
2169    const DexFile& dex_file = *manager_->GetDexFile();
2170    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2171    const char* descriptor = dex_file.GetClassDescriptor(class_def);
2172    ClassLinker* class_linker = manager_->GetClassLinker();
2173    jobject jclass_loader = manager_->GetClassLoader();
2174    StackHandleScope<3> hs(soa.Self());
2175    Handle<mirror::ClassLoader> class_loader(
2176        hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
2177    Handle<mirror::Class> klass(
2178        hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2179    // Class might have failed resolution. Then don't set it to verified.
2180    if (klass != nullptr) {
2181      // Only do this if the class is resolved. If even resolution fails, quickening will go very,
2182      // very wrong.
2183      if (klass->IsResolved() && !klass->IsErroneousResolved()) {
2184        if (klass->GetStatus() < ClassStatus::kVerified) {
2185          ObjectLock<mirror::Class> lock(soa.Self(), klass);
2186          // Set class status to verified.
2187          mirror::Class::SetStatus(klass, ClassStatus::kVerified, soa.Self());
2188          // Mark methods as pre-verified. If we don't do this, the interpreter will run with
2189          // access checks.
2190          klass->SetSkipAccessChecksFlagOnAllMethods(
2191              GetInstructionSetPointerSize(manager_->GetCompiler()->GetInstructionSet()));
2192          klass->SetVerificationAttempted();
2193        }
2194        // Record the final class status if necessary.
2195        ClassReference ref(manager_->GetDexFile(), class_def_index);
2196        manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
2197      }
2198    } else {
2199      Thread* self = soa.Self();
2200      DCHECK(self->IsExceptionPending());
2201      self->ClearException();
2202    }
2203  }
2204
2205 private:
2206  const ParallelCompilationManager* const manager_;
2207};
2208
2209void CompilerDriver::SetVerifiedDexFile(jobject class_loader,
2210                                        const DexFile& dex_file,
2211                                        const std::vector<const DexFile*>& dex_files,
2212                                        ThreadPool* thread_pool,
2213                                        size_t thread_count,
2214                                        TimingLogger* timings) {
2215  TimingLogger::ScopedTiming t("Verify Dex File", timings);
2216  if (!compiled_classes_.HaveDexFile(&dex_file)) {
2217    compiled_classes_.AddDexFile(&dex_file);
2218  }
2219  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2220  ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2221                                     thread_pool);
2222  SetVerifiedClassVisitor visitor(&context);
2223  context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
2224}
2225
2226class InitializeClassVisitor : public CompilationVisitor {
2227 public:
2228  explicit InitializeClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2229
2230  void Visit(size_t class_def_index) OVERRIDE {
2231    ScopedTrace trace(__FUNCTION__);
2232    jobject jclass_loader = manager_->GetClassLoader();
2233    const DexFile& dex_file = *manager_->GetDexFile();
2234    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2235    const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def.class_idx_);
2236    const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
2237
2238    ScopedObjectAccess soa(Thread::Current());
2239    StackHandleScope<3> hs(soa.Self());
2240    Handle<mirror::ClassLoader> class_loader(
2241        hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
2242    Handle<mirror::Class> klass(
2243        hs.NewHandle(manager_->GetClassLinker()->FindClass(soa.Self(), descriptor, class_loader)));
2244
2245    if (klass != nullptr && !SkipClass(manager_->GetClassLoader(), dex_file, klass.Get())) {
2246      TryInitializeClass(klass, class_loader);
2247    }
2248    // Clear any class not found or verification exceptions.
2249    soa.Self()->ClearException();
2250  }
2251
2252  // A helper function for initializing klass.
2253  void TryInitializeClass(Handle<mirror::Class> klass, Handle<mirror::ClassLoader>& class_loader)
2254      REQUIRES_SHARED(Locks::mutator_lock_) {
2255    const DexFile& dex_file = klass->GetDexFile();
2256    const DexFile::ClassDef* class_def = klass->GetClassDef();
2257    const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def->class_idx_);
2258    const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
2259    ScopedObjectAccessUnchecked soa(Thread::Current());
2260    StackHandleScope<3> hs(soa.Self());
2261    const bool is_boot_image = manager_->GetCompiler()->GetCompilerOptions().IsBootImage();
2262    const bool is_app_image = manager_->GetCompiler()->GetCompilerOptions().IsAppImage();
2263
2264    ClassStatus old_status = klass->GetStatus();
2265    // Don't initialize classes in boot space when compiling app image
2266    if (is_app_image && klass->IsBootStrapClassLoaded()) {
2267      // Also return early and don't store the class status in the recorded class status.
2268      return;
2269    }
2270    // Only try to initialize classes that were successfully verified.
2271    if (klass->IsVerified()) {
2272      // Attempt to initialize the class but bail if we either need to initialize the super-class
2273      // or static fields.
2274      manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, false);
2275      old_status = klass->GetStatus();
2276      if (!klass->IsInitialized()) {
2277        // We don't want non-trivial class initialization occurring on multiple threads due to
2278        // deadlock problems. For example, a parent class is initialized (holding its lock) that
2279        // refers to a sub-class in its static/class initializer causing it to try to acquire the
2280        // sub-class' lock. While on a second thread the sub-class is initialized (holding its lock)
2281        // after first initializing its parents, whose locks are acquired. This leads to a
2282        // parent-to-child and a child-to-parent lock ordering and consequent potential deadlock.
2283        // We need to use an ObjectLock due to potential suspension in the interpreting code. Rather
2284        // than use a special Object for the purpose we use the Class of java.lang.Class.
2285        Handle<mirror::Class> h_klass(hs.NewHandle(klass->GetClass()));
2286        ObjectLock<mirror::Class> lock(soa.Self(), h_klass);
2287        // Attempt to initialize allowing initialization of parent classes but still not static
2288        // fields.
2289        // Initialize dependencies first only for app image, to make TryInitialize recursive.
2290        bool is_superclass_initialized = !is_app_image ? true :
2291            InitializeDependencies(klass, class_loader, soa.Self());
2292        if (!is_app_image || (is_app_image && is_superclass_initialized)) {
2293          manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, true);
2294        }
2295        // Otherwise it's in app image but superclasses can't be initialized, no need to proceed.
2296        old_status = klass->GetStatus();
2297
2298        bool too_many_encoded_fields = false;
2299        if (!is_boot_image && klass->NumStaticFields() > kMaxEncodedFields) {
2300          too_many_encoded_fields = true;
2301        }
2302        // If the class was not initialized, we can proceed to see if we can initialize static
2303        // fields. Limit the max number of encoded fields.
2304        if (!klass->IsInitialized() &&
2305            (is_app_image || is_boot_image) &&
2306            is_superclass_initialized &&
2307            !too_many_encoded_fields &&
2308            manager_->GetCompiler()->IsImageClass(descriptor)) {
2309          bool can_init_static_fields = false;
2310          if (is_boot_image) {
2311            // We need to initialize static fields, we only do this for image classes that aren't
2312            // marked with the $NoPreloadHolder (which implies this should not be initialized
2313            // early).
2314            can_init_static_fields = !StringPiece(descriptor).ends_with("$NoPreloadHolder;");
2315          } else {
2316            CHECK(is_app_image);
2317            // The boot image case doesn't need to recursively initialize the dependencies with
2318            // special logic since the class linker already does this.
2319            can_init_static_fields =
2320                !soa.Self()->IsExceptionPending() &&
2321                is_superclass_initialized &&
2322                NoClinitInDependency(klass, soa.Self(), &class_loader);
2323            // TODO The checking for clinit can be removed since it's already
2324            // checked when init superclass. Currently keep it because it contains
2325            // processing of intern strings. Will be removed later when intern strings
2326            // and clinit are both initialized.
2327          }
2328
2329          if (can_init_static_fields) {
2330            VLOG(compiler) << "Initializing: " << descriptor;
2331            // TODO multithreading support. We should ensure the current compilation thread has
2332            // exclusive access to the runtime and the transaction. To achieve this, we could use
2333            // a ReaderWriterMutex but we're holding the mutator lock so we fail mutex sanity
2334            // checks in Thread::AssertThreadSuspensionIsAllowable.
2335            Runtime* const runtime = Runtime::Current();
2336            // Run the class initializer in transaction mode.
2337            runtime->EnterTransactionMode(is_app_image, klass.Get());
2338            bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true,
2339                                                                         true);
2340            // TODO we detach transaction from runtime to indicate we quit the transactional
2341            // mode which prevents the GC from visiting objects modified during the transaction.
2342            // Ensure GC is not run so don't access freed objects when aborting transaction.
2343
2344            {
2345              ScopedAssertNoThreadSuspension ants("Transaction end");
2346
2347              if (success) {
2348                runtime->ExitTransactionMode();
2349                DCHECK(!runtime->IsActiveTransaction());
2350              }
2351
2352              if (!success) {
2353                CHECK(soa.Self()->IsExceptionPending());
2354                mirror::Throwable* exception = soa.Self()->GetException();
2355                VLOG(compiler) << "Initialization of " << descriptor << " aborted because of "
2356                               << exception->Dump();
2357                std::ostream* file_log = manager_->GetCompiler()->
2358                    GetCompilerOptions().GetInitFailureOutput();
2359                if (file_log != nullptr) {
2360                  *file_log << descriptor << "\n";
2361                  *file_log << exception->Dump() << "\n";
2362                }
2363                soa.Self()->ClearException();
2364                runtime->RollbackAllTransactions();
2365                CHECK_EQ(old_status, klass->GetStatus()) << "Previous class status not restored";
2366              } else if (is_boot_image) {
2367                // For boot image, we want to put the updated status in the oat class since we can't
2368                // reject the image anyways.
2369                old_status = klass->GetStatus();
2370              }
2371            }
2372
2373            if (!success) {
2374              // On failure, still intern strings of static fields and seen in <clinit>, as these
2375              // will be created in the zygote. This is separated from the transaction code just
2376              // above as we will allocate strings, so must be allowed to suspend.
2377              if (&klass->GetDexFile() == manager_->GetDexFile()) {
2378                InternStrings(klass, class_loader);
2379              } else {
2380                DCHECK(!is_boot_image) << "Boot image must have equal dex files";
2381              }
2382            }
2383          }
2384        }
2385        // If the class still isn't initialized, at least try some checks that initialization
2386        // would do so they can be skipped at runtime.
2387        if (!klass->IsInitialized() &&
2388            manager_->GetClassLinker()->ValidateSuperClassDescriptors(klass)) {
2389          old_status = ClassStatus::kSuperclassValidated;
2390        } else {
2391          soa.Self()->ClearException();
2392        }
2393        soa.Self()->AssertNoPendingException();
2394      }
2395    }
2396    // Record the final class status if necessary.
2397    ClassReference ref(&dex_file, klass->GetDexClassDefIndex());
2398    // Back up the status before doing initialization for static encoded fields,
2399    // because the static encoded branch wants to keep the status to uninitialized.
2400    manager_->GetCompiler()->RecordClassStatus(ref, old_status);
2401  }
2402
2403 private:
2404  void InternStrings(Handle<mirror::Class> klass, Handle<mirror::ClassLoader> class_loader)
2405      REQUIRES_SHARED(Locks::mutator_lock_) {
2406    DCHECK(manager_->GetCompiler()->GetCompilerOptions().IsBootImage());
2407    DCHECK(klass->IsVerified());
2408    DCHECK(!klass->IsInitialized());
2409
2410    StackHandleScope<1> hs(Thread::Current());
2411    Handle<mirror::DexCache> dex_cache = hs.NewHandle(klass->GetDexCache());
2412    const DexFile::ClassDef* class_def = klass->GetClassDef();
2413    ClassLinker* class_linker = manager_->GetClassLinker();
2414
2415    // Check encoded final field values for strings and intern.
2416    annotations::RuntimeEncodedStaticFieldValueIterator value_it(dex_cache,
2417                                                                 class_loader,
2418                                                                 manager_->GetClassLinker(),
2419                                                                 *class_def);
2420    for ( ; value_it.HasNext(); value_it.Next()) {
2421      if (value_it.GetValueType() == annotations::RuntimeEncodedStaticFieldValueIterator::kString) {
2422        // Resolve the string. This will intern the string.
2423        art::ObjPtr<mirror::String> resolved = class_linker->ResolveString(
2424            dex::StringIndex(value_it.GetJavaValue().i), dex_cache);
2425        CHECK(resolved != nullptr);
2426      }
2427    }
2428
2429    // Intern strings seen in <clinit>.
2430    ArtMethod* clinit = klass->FindClassInitializer(class_linker->GetImagePointerSize());
2431    if (clinit != nullptr) {
2432      for (const DexInstructionPcPair& inst : clinit->DexInstructions()) {
2433        if (inst->Opcode() == Instruction::CONST_STRING) {
2434          ObjPtr<mirror::String> s = class_linker->ResolveString(
2435              dex::StringIndex(inst->VRegB_21c()), dex_cache);
2436          CHECK(s != nullptr);
2437        } else if (inst->Opcode() == Instruction::CONST_STRING_JUMBO) {
2438          ObjPtr<mirror::String> s = class_linker->ResolveString(
2439              dex::StringIndex(inst->VRegB_31c()), dex_cache);
2440          CHECK(s != nullptr);
2441        }
2442      }
2443    }
2444  }
2445
2446  bool ResolveTypesOfMethods(Thread* self, ArtMethod* m)
2447      REQUIRES_SHARED(Locks::mutator_lock_) {
2448    // Return value of ResolveReturnType() is discarded because resolve will be done internally.
2449    ObjPtr<mirror::Class> rtn_type = m->ResolveReturnType();
2450    if (rtn_type == nullptr) {
2451      self->ClearException();
2452      return false;
2453    }
2454    const DexFile::TypeList* types = m->GetParameterTypeList();
2455    if (types != nullptr) {
2456      for (uint32_t i = 0; i < types->Size(); ++i) {
2457        dex::TypeIndex param_type_idx = types->GetTypeItem(i).type_idx_;
2458        ObjPtr<mirror::Class> param_type = m->ResolveClassFromTypeIndex(param_type_idx);
2459        if (param_type == nullptr) {
2460          self->ClearException();
2461          return false;
2462        }
2463      }
2464    }
2465    return true;
2466  }
2467
2468  // Pre resolve types mentioned in all method signatures before start a transaction
2469  // since ResolveType doesn't work in transaction mode.
2470  bool PreResolveTypes(Thread* self, const Handle<mirror::Class>& klass)
2471      REQUIRES_SHARED(Locks::mutator_lock_) {
2472    PointerSize pointer_size = manager_->GetClassLinker()->GetImagePointerSize();
2473    for (ArtMethod& m : klass->GetMethods(pointer_size)) {
2474      if (!ResolveTypesOfMethods(self, &m)) {
2475        return false;
2476      }
2477    }
2478    if (klass->IsInterface()) {
2479      return true;
2480    } else if (klass->HasSuperClass()) {
2481      StackHandleScope<1> hs(self);
2482      MutableHandle<mirror::Class> super_klass(hs.NewHandle<mirror::Class>(klass->GetSuperClass()));
2483      for (int i = super_klass->GetVTableLength() - 1; i >= 0; --i) {
2484        ArtMethod* m = klass->GetVTableEntry(i, pointer_size);
2485        ArtMethod* super_m = super_klass->GetVTableEntry(i, pointer_size);
2486        if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
2487          return false;
2488        }
2489      }
2490      for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) {
2491        super_klass.Assign(klass->GetIfTable()->GetInterface(i));
2492        if (klass->GetClassLoader() != super_klass->GetClassLoader()) {
2493          uint32_t num_methods = super_klass->NumVirtualMethods();
2494          for (uint32_t j = 0; j < num_methods; ++j) {
2495            ArtMethod* m = klass->GetIfTable()->GetMethodArray(i)->GetElementPtrSize<ArtMethod*>(
2496                j, pointer_size);
2497            ArtMethod* super_m = super_klass->GetVirtualMethod(j, pointer_size);
2498            if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
2499              return false;
2500            }
2501          }
2502        }
2503      }
2504    }
2505    return true;
2506  }
2507
2508  // Initialize the klass's dependencies recursively before initializing itself.
2509  // Checking for interfaces is also necessary since interfaces can contain
2510  // both default methods and static encoded fields.
2511  bool InitializeDependencies(const Handle<mirror::Class>& klass,
2512                              Handle<mirror::ClassLoader> class_loader,
2513                              Thread* self)
2514      REQUIRES_SHARED(Locks::mutator_lock_) {
2515    if (klass->HasSuperClass()) {
2516      ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
2517      StackHandleScope<1> hs(self);
2518      Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
2519      if (!handle_scope_super->IsInitialized()) {
2520        this->TryInitializeClass(handle_scope_super, class_loader);
2521        if (!handle_scope_super->IsInitialized()) {
2522          return false;
2523        }
2524      }
2525    }
2526
2527    uint32_t num_if = klass->NumDirectInterfaces();
2528    for (size_t i = 0; i < num_if; i++) {
2529      ObjPtr<mirror::Class>
2530          interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
2531      StackHandleScope<1> hs(self);
2532      Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
2533
2534      TryInitializeClass(handle_interface, class_loader);
2535
2536      if (!handle_interface->IsInitialized()) {
2537        return false;
2538      }
2539    }
2540
2541    return PreResolveTypes(self, klass);
2542  }
2543
2544  // In this phase the classes containing class initializers are ignored. Make sure no
2545  // clinit appears in kalss's super class chain and interfaces.
2546  bool NoClinitInDependency(const Handle<mirror::Class>& klass,
2547                            Thread* self,
2548                            Handle<mirror::ClassLoader>* class_loader)
2549      REQUIRES_SHARED(Locks::mutator_lock_) {
2550    ArtMethod* clinit =
2551        klass->FindClassInitializer(manager_->GetClassLinker()->GetImagePointerSize());
2552    if (clinit != nullptr) {
2553      VLOG(compiler) << klass->PrettyClass() << ' ' << clinit->PrettyMethod(true);
2554      return false;
2555    }
2556    if (klass->HasSuperClass()) {
2557      ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
2558      StackHandleScope<1> hs(self);
2559      Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
2560      if (!NoClinitInDependency(handle_scope_super, self, class_loader)) {
2561        return false;
2562      }
2563    }
2564
2565    uint32_t num_if = klass->NumDirectInterfaces();
2566    for (size_t i = 0; i < num_if; i++) {
2567      ObjPtr<mirror::Class>
2568          interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
2569      StackHandleScope<1> hs(self);
2570      Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
2571      if (!NoClinitInDependency(handle_interface, self, class_loader)) {
2572        return false;
2573      }
2574    }
2575
2576    return true;
2577  }
2578
2579  const ParallelCompilationManager* const manager_;
2580};
2581
2582void CompilerDriver::InitializeClasses(jobject jni_class_loader,
2583                                       const DexFile& dex_file,
2584                                       const std::vector<const DexFile*>& dex_files,
2585                                       TimingLogger* timings) {
2586  TimingLogger::ScopedTiming t("InitializeNoClinit", timings);
2587
2588  // Initialization allocates objects and needs to run single-threaded to be deterministic.
2589  bool force_determinism = GetCompilerOptions().IsForceDeterminism();
2590  ThreadPool* init_thread_pool = force_determinism
2591                                     ? single_thread_pool_.get()
2592                                     : parallel_thread_pool_.get();
2593  size_t init_thread_count = force_determinism ? 1U : parallel_thread_count_;
2594
2595  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2596  ParallelCompilationManager context(class_linker, jni_class_loader, this, &dex_file, dex_files,
2597                                     init_thread_pool);
2598
2599  if (GetCompilerOptions().IsBootImage() || GetCompilerOptions().IsAppImage()) {
2600    // Set the concurrency thread to 1 to support initialization for App Images since transaction
2601    // doesn't support multithreading now.
2602    // TODO: remove this when transactional mode supports multithreading.
2603    init_thread_count = 1U;
2604  }
2605  InitializeClassVisitor visitor(&context);
2606  context.ForAll(0, dex_file.NumClassDefs(), &visitor, init_thread_count);
2607}
2608
2609class InitializeArrayClassesAndCreateConflictTablesVisitor : public ClassVisitor {
2610 public:
2611  explicit InitializeArrayClassesAndCreateConflictTablesVisitor(VariableSizedHandleScope& hs)
2612      : hs_(hs) {}
2613
2614  virtual bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE
2615      REQUIRES_SHARED(Locks::mutator_lock_) {
2616    if (Runtime::Current()->GetHeap()->ObjectIsInBootImageSpace(klass)) {
2617      return true;
2618    }
2619    if (klass->IsArrayClass()) {
2620      StackHandleScope<1> hs(Thread::Current());
2621      auto h_klass = hs.NewHandleWrapper(&klass);
2622      Runtime::Current()->GetClassLinker()->EnsureInitialized(hs.Self(), h_klass, true, true);
2623    }
2624    // Collect handles since there may be thread suspension in future EnsureInitialized.
2625    to_visit_.push_back(hs_.NewHandle(klass));
2626    return true;
2627  }
2628
2629  void FillAllIMTAndConflictTables() REQUIRES_SHARED(Locks::mutator_lock_) {
2630    for (Handle<mirror::Class> c : to_visit_) {
2631      // Create the conflict tables.
2632      FillIMTAndConflictTables(c.Get());
2633    }
2634  }
2635
2636 private:
2637  void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass)
2638      REQUIRES_SHARED(Locks::mutator_lock_) {
2639    if (!klass->ShouldHaveImt()) {
2640      return;
2641    }
2642    if (visited_classes_.find(klass) != visited_classes_.end()) {
2643      return;
2644    }
2645    if (klass->HasSuperClass()) {
2646      FillIMTAndConflictTables(klass->GetSuperClass());
2647    }
2648    if (!klass->IsTemp()) {
2649      Runtime::Current()->GetClassLinker()->FillIMTAndConflictTables(klass);
2650    }
2651    visited_classes_.insert(klass);
2652  }
2653
2654  VariableSizedHandleScope& hs_;
2655  std::vector<Handle<mirror::Class>> to_visit_;
2656  std::unordered_set<ObjPtr<mirror::Class>, HashObjPtr> visited_classes_;
2657};
2658
2659void CompilerDriver::InitializeClasses(jobject class_loader,
2660                                       const std::vector<const DexFile*>& dex_files,
2661                                       TimingLogger* timings) {
2662  for (size_t i = 0; i != dex_files.size(); ++i) {
2663    const DexFile* dex_file = dex_files[i];
2664    CHECK(dex_file != nullptr);
2665    InitializeClasses(class_loader, *dex_file, dex_files, timings);
2666  }
2667  if (GetCompilerOptions().IsBootImage() || GetCompilerOptions().IsAppImage()) {
2668    // Make sure that we call EnsureIntiailized on all the array classes to call
2669    // SetVerificationAttempted so that the access flags are set. If we do not do this they get
2670    // changed at runtime resulting in more dirty image pages.
2671    // Also create conflict tables.
2672    // Only useful if we are compiling an image (image_classes_ is not null).
2673    ScopedObjectAccess soa(Thread::Current());
2674    VariableSizedHandleScope hs(soa.Self());
2675    InitializeArrayClassesAndCreateConflictTablesVisitor visitor(hs);
2676    Runtime::Current()->GetClassLinker()->VisitClassesWithoutClassesLock(&visitor);
2677    visitor.FillAllIMTAndConflictTables();
2678  }
2679  if (GetCompilerOptions().IsBootImage()) {
2680    // Prune garbage objects created during aborted transactions.
2681    Runtime::Current()->GetHeap()->CollectGarbage(true);
2682  }
2683}
2684
2685template <typename CompileFn>
2686static void CompileDexFile(CompilerDriver* driver,
2687                           jobject class_loader,
2688                           const DexFile& dex_file,
2689                           const std::vector<const DexFile*>& dex_files,
2690                           ThreadPool* thread_pool,
2691                           size_t thread_count,
2692                           TimingLogger* timings,
2693                           const char* timing_name,
2694                           CompileFn compile_fn) {
2695  TimingLogger::ScopedTiming t(timing_name, timings);
2696  ParallelCompilationManager context(Runtime::Current()->GetClassLinker(),
2697                                     class_loader,
2698                                     driver,
2699                                     &dex_file,
2700                                     dex_files,
2701                                     thread_pool);
2702
2703  auto compile = [&context, &compile_fn](size_t class_def_index) {
2704    ScopedTrace trace(__FUNCTION__);
2705    const DexFile& dex_file = *context.GetDexFile();
2706    const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2707    ClassLinker* class_linker = context.GetClassLinker();
2708    jobject jclass_loader = context.GetClassLoader();
2709    ClassReference ref(&dex_file, class_def_index);
2710    // Skip compiling classes with generic verifier failures since they will still fail at runtime
2711    if (context.GetCompiler()->GetVerificationResults()->IsClassRejected(ref)) {
2712      return;
2713    }
2714    // Use a scoped object access to perform to the quick SkipClass check.
2715    const char* descriptor = dex_file.GetClassDescriptor(class_def);
2716    ScopedObjectAccess soa(Thread::Current());
2717    StackHandleScope<3> hs(soa.Self());
2718    Handle<mirror::ClassLoader> class_loader(
2719        hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
2720    Handle<mirror::Class> klass(
2721        hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2722    Handle<mirror::DexCache> dex_cache;
2723    if (klass == nullptr) {
2724      soa.Self()->AssertPendingException();
2725      soa.Self()->ClearException();
2726      dex_cache = hs.NewHandle(class_linker->FindDexCache(soa.Self(), dex_file));
2727    } else if (SkipClass(jclass_loader, dex_file, klass.Get())) {
2728      return;
2729    } else {
2730      dex_cache = hs.NewHandle(klass->GetDexCache());
2731    }
2732
2733    const uint8_t* class_data = dex_file.GetClassData(class_def);
2734    if (class_data == nullptr) {
2735      // empty class, probably a marker interface
2736      return;
2737    }
2738
2739    // Go to native so that we don't block GC during compilation.
2740    ScopedThreadSuspension sts(soa.Self(), kNative);
2741
2742    CompilerDriver* const driver = context.GetCompiler();
2743
2744    // Can we run DEX-to-DEX compiler on this class ?
2745    optimizer::DexToDexCompiler::CompilationLevel dex_to_dex_compilation_level =
2746        GetDexToDexCompilationLevel(soa.Self(), *driver, jclass_loader, dex_file, class_def);
2747
2748    ClassDataItemIterator it(dex_file, class_data);
2749    it.SkipAllFields();
2750
2751    bool compilation_enabled = driver->IsClassToCompile(
2752        dex_file.StringByTypeIdx(class_def.class_idx_));
2753
2754    // Compile direct and virtual methods.
2755    int64_t previous_method_idx = -1;
2756    while (it.HasNextMethod()) {
2757      uint32_t method_idx = it.GetMemberIndex();
2758      if (method_idx == previous_method_idx) {
2759        // smali can create dex files with two encoded_methods sharing the same method_idx
2760        // http://code.google.com/p/smali/issues/detail?id=119
2761        it.Next();
2762        continue;
2763      }
2764      previous_method_idx = method_idx;
2765      compile_fn(soa.Self(),
2766                 driver,
2767                 it.GetMethodCodeItem(),
2768                 it.GetMethodAccessFlags(),
2769                 it.GetMethodInvokeType(class_def),
2770                 class_def_index,
2771                 method_idx,
2772                 class_loader,
2773                 dex_file,
2774                 dex_to_dex_compilation_level,
2775                 compilation_enabled,
2776                 dex_cache);
2777      it.Next();
2778    }
2779    DCHECK(!it.HasNext());
2780  };
2781  context.ForAllLambda(0, dex_file.NumClassDefs(), compile, thread_count);
2782}
2783
2784void CompilerDriver::Compile(jobject class_loader,
2785                             const std::vector<const DexFile*>& dex_files,
2786                             TimingLogger* timings) {
2787  if (kDebugProfileGuidedCompilation) {
2788    LOG(INFO) << "[ProfileGuidedCompilation] " <<
2789        ((profile_compilation_info_ == nullptr)
2790            ? "null"
2791            : profile_compilation_info_->DumpInfo(&dex_files));
2792  }
2793
2794  dex_to_dex_compiler_.ClearState();
2795  for (const DexFile* dex_file : dex_files) {
2796    CHECK(dex_file != nullptr);
2797    CompileDexFile(this,
2798                   class_loader,
2799                   *dex_file,
2800                   dex_files,
2801                   parallel_thread_pool_.get(),
2802                   parallel_thread_count_,
2803                   timings,
2804                   "Compile Dex File Quick",
2805                   CompileMethodQuick);
2806    const ArenaPool* const arena_pool = Runtime::Current()->GetArenaPool();
2807    const size_t arena_alloc = arena_pool->GetBytesAllocated();
2808    max_arena_alloc_ = std::max(arena_alloc, max_arena_alloc_);
2809    Runtime::Current()->ReclaimArenaPoolMemory();
2810  }
2811
2812  if (dex_to_dex_compiler_.NumCodeItemsToQuicken(Thread::Current()) > 0u) {
2813    // TODO: Not visit all of the dex files, its probably rare that only one would have quickened
2814    // methods though.
2815    for (const DexFile* dex_file : dex_files) {
2816      CompileDexFile(this,
2817                     class_loader,
2818                     *dex_file,
2819                     dex_files,
2820                     parallel_thread_pool_.get(),
2821                     parallel_thread_count_,
2822                     timings,
2823                     "Compile Dex File Dex2Dex",
2824                     CompileMethodDex2Dex);
2825    }
2826    dex_to_dex_compiler_.ClearState();
2827  }
2828
2829  VLOG(compiler) << "Compile: " << GetMemoryUsageString(false);
2830}
2831
2832void CompilerDriver::AddCompiledMethod(const MethodReference& method_ref,
2833                                       CompiledMethod* const compiled_method,
2834                                       size_t non_relative_linker_patch_count) {
2835  DCHECK(GetCompiledMethod(method_ref) == nullptr) << method_ref.PrettyMethod();
2836  MethodTable::InsertResult result = compiled_methods_.Insert(method_ref,
2837                                                              /*expected*/ nullptr,
2838                                                              compiled_method);
2839  CHECK(result == MethodTable::kInsertResultSuccess);
2840  non_relative_linker_patch_count_.FetchAndAddRelaxed(non_relative_linker_patch_count);
2841  DCHECK(GetCompiledMethod(method_ref) != nullptr) << method_ref.PrettyMethod();
2842}
2843
2844CompiledMethod* CompilerDriver::RemoveCompiledMethod(const MethodReference& method_ref) {
2845  CompiledMethod* ret = nullptr;
2846  CHECK(compiled_methods_.Remove(method_ref, &ret));
2847  return ret;
2848}
2849
2850bool CompilerDriver::GetCompiledClass(const ClassReference& ref, ClassStatus* status) const {
2851  DCHECK(status != nullptr);
2852  // The table doesn't know if something wasn't inserted. For this case it will return
2853  // ClassStatus::kNotReady. To handle this, just assume anything we didn't try to verify
2854  // is not compiled.
2855  if (!compiled_classes_.Get(ref, status) ||
2856      *status < ClassStatus::kRetryVerificationAtRuntime) {
2857    return false;
2858  }
2859  return true;
2860}
2861
2862ClassStatus CompilerDriver::GetClassStatus(const ClassReference& ref) const {
2863  ClassStatus status = ClassStatus::kNotReady;
2864  if (!GetCompiledClass(ref, &status)) {
2865    classpath_classes_.Get(ref, &status);
2866  }
2867  return status;
2868}
2869
2870void CompilerDriver::RecordClassStatus(const ClassReference& ref, ClassStatus status) {
2871  switch (status) {
2872    case ClassStatus::kErrorResolved:
2873    case ClassStatus::kErrorUnresolved:
2874    case ClassStatus::kNotReady:
2875    case ClassStatus::kResolved:
2876    case ClassStatus::kRetryVerificationAtRuntime:
2877    case ClassStatus::kVerified:
2878    case ClassStatus::kSuperclassValidated:
2879    case ClassStatus::kInitialized:
2880      break;  // Expected states.
2881    default:
2882      LOG(FATAL) << "Unexpected class status for class "
2883          << PrettyDescriptor(
2884              ref.dex_file->GetClassDescriptor(ref.dex_file->GetClassDef(ref.index)))
2885          << " of " << status;
2886  }
2887
2888  ClassStateTable::InsertResult result;
2889  ClassStateTable* table = &compiled_classes_;
2890  do {
2891    ClassStatus existing = ClassStatus::kNotReady;
2892    if (!table->Get(ref, &existing)) {
2893      // A classpath class.
2894      if (kIsDebugBuild) {
2895        // Check to make sure it's not a dex file for an oat file we are compiling since these
2896        // should always succeed. These do not include classes in for used libraries.
2897        for (const DexFile* dex_file : GetDexFilesForOatFile()) {
2898          CHECK_NE(ref.dex_file, dex_file) << ref.dex_file->GetLocation();
2899        }
2900      }
2901      if (!classpath_classes_.HaveDexFile(ref.dex_file)) {
2902        // Boot classpath dex file.
2903        return;
2904      }
2905      table = &classpath_classes_;
2906      table->Get(ref, &existing);
2907    }
2908    if (existing >= status) {
2909      // Existing status is already better than we expect, break.
2910      break;
2911    }
2912    // Update the status if we now have a greater one. This happens with vdex,
2913    // which records a class is verified, but does not resolve it.
2914    result = table->Insert(ref, existing, status);
2915    CHECK(result != ClassStateTable::kInsertResultInvalidDexFile) << ref.dex_file->GetLocation();
2916  } while (result != ClassStateTable::kInsertResultSuccess);
2917}
2918
2919CompiledMethod* CompilerDriver::GetCompiledMethod(MethodReference ref) const {
2920  CompiledMethod* compiled_method = nullptr;
2921  compiled_methods_.Get(ref, &compiled_method);
2922  return compiled_method;
2923}
2924
2925bool CompilerDriver::IsMethodVerifiedWithoutFailures(uint32_t method_idx,
2926                                                     uint16_t class_def_idx,
2927                                                     const DexFile& dex_file) const {
2928  const VerifiedMethod* verified_method = GetVerifiedMethod(&dex_file, method_idx);
2929  if (verified_method != nullptr) {
2930    return !verified_method->HasVerificationFailures();
2931  }
2932
2933  // If we can't find verification metadata, check if this is a system class (we trust that system
2934  // classes have their methods verified). If it's not, be conservative and assume the method
2935  // has not been verified successfully.
2936
2937  // TODO: When compiling the boot image it should be safe to assume that everything is verified,
2938  // even if methods are not found in the verification cache.
2939  const char* descriptor = dex_file.GetClassDescriptor(dex_file.GetClassDef(class_def_idx));
2940  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2941  Thread* self = Thread::Current();
2942  ScopedObjectAccess soa(self);
2943  bool is_system_class = class_linker->FindSystemClass(self, descriptor) != nullptr;
2944  if (!is_system_class) {
2945    self->ClearException();
2946  }
2947  return is_system_class;
2948}
2949
2950size_t CompilerDriver::GetNonRelativeLinkerPatchCount() const {
2951  return non_relative_linker_patch_count_.LoadRelaxed();
2952}
2953
2954void CompilerDriver::SetRequiresConstructorBarrier(Thread* self,
2955                                                   const DexFile* dex_file,
2956                                                   uint16_t class_def_index,
2957                                                   bool requires) {
2958  WriterMutexLock mu(self, requires_constructor_barrier_lock_);
2959  requires_constructor_barrier_.emplace(ClassReference(dex_file, class_def_index), requires);
2960}
2961
2962bool CompilerDriver::RequiresConstructorBarrier(Thread* self,
2963                                                const DexFile* dex_file,
2964                                                uint16_t class_def_index) {
2965  ClassReference class_ref(dex_file, class_def_index);
2966  {
2967    ReaderMutexLock mu(self, requires_constructor_barrier_lock_);
2968    auto it = requires_constructor_barrier_.find(class_ref);
2969    if (it != requires_constructor_barrier_.end()) {
2970      return it->second;
2971    }
2972  }
2973  WriterMutexLock mu(self, requires_constructor_barrier_lock_);
2974  const bool requires = RequiresConstructorBarrier(*dex_file, class_def_index);
2975  requires_constructor_barrier_.emplace(class_ref, requires);
2976  return requires;
2977}
2978
2979std::string CompilerDriver::GetMemoryUsageString(bool extended) const {
2980  std::ostringstream oss;
2981  const gc::Heap* const heap = Runtime::Current()->GetHeap();
2982  const size_t java_alloc = heap->GetBytesAllocated();
2983  oss << "arena alloc=" << PrettySize(max_arena_alloc_) << " (" << max_arena_alloc_ << "B)";
2984  oss << " java alloc=" << PrettySize(java_alloc) << " (" << java_alloc << "B)";
2985#if defined(__BIONIC__) || defined(__GLIBC__)
2986  const struct mallinfo info = mallinfo();
2987  const size_t allocated_space = static_cast<size_t>(info.uordblks);
2988  const size_t free_space = static_cast<size_t>(info.fordblks);
2989  oss << " native alloc=" << PrettySize(allocated_space) << " (" << allocated_space << "B)"
2990      << " free=" << PrettySize(free_space) << " (" << free_space << "B)";
2991#endif
2992  compiled_method_storage_.DumpMemoryUsage(oss, extended);
2993  return oss.str();
2994}
2995
2996bool CompilerDriver::MayInlineInternal(const DexFile* inlined_from,
2997                                       const DexFile* inlined_into) const {
2998  // We're not allowed to inline across dex files if we're the no-inline-from dex file.
2999  if (inlined_from != inlined_into &&
3000      compiler_options_->GetNoInlineFromDexFile() != nullptr &&
3001      ContainsElement(*compiler_options_->GetNoInlineFromDexFile(), inlined_from)) {
3002    return false;
3003  }
3004
3005  return true;
3006}
3007
3008void CompilerDriver::InitializeThreadPools() {
3009  size_t parallel_count = parallel_thread_count_ > 0 ? parallel_thread_count_ - 1 : 0;
3010  parallel_thread_pool_.reset(
3011      new ThreadPool("Compiler driver thread pool", parallel_count));
3012  single_thread_pool_.reset(new ThreadPool("Single-threaded Compiler driver thread pool", 0));
3013}
3014
3015void CompilerDriver::FreeThreadPools() {
3016  parallel_thread_pool_.reset();
3017  single_thread_pool_.reset();
3018}
3019
3020void CompilerDriver::SetDexFilesForOatFile(const std::vector<const DexFile*>& dex_files) {
3021  dex_files_for_oat_file_ = dex_files;
3022  compiled_classes_.AddDexFiles(dex_files);
3023  dex_to_dex_compiler_.SetDexFiles(dex_files);
3024}
3025
3026void CompilerDriver::SetClasspathDexFiles(const std::vector<const DexFile*>& dex_files) {
3027  classpath_classes_.AddDexFiles(dex_files);
3028}
3029
3030}  // namespace art
3031