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