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