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