Home | History | Annotate | Download | only in jit
      1 /*
      2  * Copyright 2014 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 "jit_code_cache.h"
     18 
     19 #include <sstream>
     20 
     21 #include "arch/context.h"
     22 #include "art_method-inl.h"
     23 #include "base/enums.h"
     24 #include "base/logging.h"  // For VLOG.
     25 #include "base/quasi_atomic.h"
     26 #include "base/stl_util.h"
     27 #include "base/systrace.h"
     28 #include "base/time_utils.h"
     29 #include "cha.h"
     30 #include "debugger_interface.h"
     31 #include "dex/dex_file_loader.h"
     32 #include "entrypoints/runtime_asm_entrypoints.h"
     33 #include "gc/accounting/bitmap-inl.h"
     34 #include "gc/scoped_gc_critical_section.h"
     35 #include "handle.h"
     36 #include "intern_table.h"
     37 #include "jit/jit.h"
     38 #include "jit/profiling_info.h"
     39 #include "linear_alloc.h"
     40 #include "mem_map.h"
     41 #include "oat_file-inl.h"
     42 #include "oat_quick_method_header.h"
     43 #include "object_callbacks.h"
     44 #include "profile_compilation_info.h"
     45 #include "scoped_thread_state_change-inl.h"
     46 #include "stack.h"
     47 #include "thread-current-inl.h"
     48 #include "thread_list.h"
     49 
     50 namespace art {
     51 namespace jit {
     52 
     53 static constexpr int kProtData = PROT_READ | PROT_WRITE;
     54 static constexpr int kProtCode = PROT_READ | PROT_EXEC;
     55 
     56 static constexpr size_t kCodeSizeLogThreshold = 50 * KB;
     57 static constexpr size_t kStackMapSizeLogThreshold = 50 * KB;
     58 
     59 class JitCodeCache::JniStubKey {
     60  public:
     61   explicit JniStubKey(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_)
     62       : shorty_(method->GetShorty()),
     63         is_static_(method->IsStatic()),
     64         is_fast_native_(method->IsFastNative()),
     65         is_critical_native_(method->IsCriticalNative()),
     66         is_synchronized_(method->IsSynchronized()) {
     67     DCHECK(!(is_fast_native_ && is_critical_native_));
     68   }
     69 
     70   bool operator<(const JniStubKey& rhs) const {
     71     if (is_static_ != rhs.is_static_) {
     72       return rhs.is_static_;
     73     }
     74     if (is_synchronized_ != rhs.is_synchronized_) {
     75       return rhs.is_synchronized_;
     76     }
     77     if (is_fast_native_ != rhs.is_fast_native_) {
     78       return rhs.is_fast_native_;
     79     }
     80     if (is_critical_native_ != rhs.is_critical_native_) {
     81       return rhs.is_critical_native_;
     82     }
     83     return strcmp(shorty_, rhs.shorty_) < 0;
     84   }
     85 
     86   // Update the shorty to point to another method's shorty. Call this function when removing
     87   // the method that references the old shorty from JniCodeData and not removing the entire
     88   // JniCodeData; the old shorty may become a dangling pointer when that method is unloaded.
     89   void UpdateShorty(ArtMethod* method) const REQUIRES_SHARED(Locks::mutator_lock_) {
     90     const char* shorty = method->GetShorty();
     91     DCHECK_STREQ(shorty_, shorty);
     92     shorty_ = shorty;
     93   }
     94 
     95  private:
     96   // The shorty points to a DexFile data and may need to change
     97   // to point to the same shorty in a different DexFile.
     98   mutable const char* shorty_;
     99 
    100   const bool is_static_;
    101   const bool is_fast_native_;
    102   const bool is_critical_native_;
    103   const bool is_synchronized_;
    104 };
    105 
    106 class JitCodeCache::JniStubData {
    107  public:
    108   JniStubData() : code_(nullptr), methods_() {}
    109 
    110   void SetCode(const void* code) {
    111     DCHECK(code != nullptr);
    112     code_ = code;
    113   }
    114 
    115   const void* GetCode() const {
    116     return code_;
    117   }
    118 
    119   bool IsCompiled() const {
    120     return GetCode() != nullptr;
    121   }
    122 
    123   void AddMethod(ArtMethod* method) {
    124     if (!ContainsElement(methods_, method)) {
    125       methods_.push_back(method);
    126     }
    127   }
    128 
    129   const std::vector<ArtMethod*>& GetMethods() const {
    130     return methods_;
    131   }
    132 
    133   void RemoveMethodsIn(const LinearAlloc& alloc) {
    134     auto kept_end = std::remove_if(
    135         methods_.begin(),
    136         methods_.end(),
    137         [&alloc](ArtMethod* method) { return alloc.ContainsUnsafe(method); });
    138     methods_.erase(kept_end, methods_.end());
    139   }
    140 
    141   bool RemoveMethod(ArtMethod* method) {
    142     auto it = std::find(methods_.begin(), methods_.end(), method);
    143     if (it != methods_.end()) {
    144       methods_.erase(it);
    145       return true;
    146     } else {
    147       return false;
    148     }
    149   }
    150 
    151   void MoveObsoleteMethod(ArtMethod* old_method, ArtMethod* new_method) {
    152     std::replace(methods_.begin(), methods_.end(), old_method, new_method);
    153   }
    154 
    155  private:
    156   const void* code_;
    157   std::vector<ArtMethod*> methods_;
    158 };
    159 
    160 JitCodeCache* JitCodeCache::Create(size_t initial_capacity,
    161                                    size_t max_capacity,
    162                                    bool generate_debug_info,
    163                                    bool used_only_for_profile_data,
    164                                    std::string* error_msg) {
    165   ScopedTrace trace(__PRETTY_FUNCTION__);
    166   CHECK_GE(max_capacity, initial_capacity);
    167 
    168   // Generating debug information is for using the Linux perf tool on
    169   // host which does not work with ashmem.
    170   // Also, target linux does not support ashmem.
    171   bool use_ashmem = !generate_debug_info && !kIsTargetLinux;
    172 
    173   // With 'perf', we want a 1-1 mapping between an address and a method.
    174   bool garbage_collect_code = !generate_debug_info;
    175 
    176   // We need to have 32 bit offsets from method headers in code cache which point to things
    177   // in the data cache. If the maps are more than 4G apart, having multiple maps wouldn't work.
    178   // Ensure we're below 1 GB to be safe.
    179   if (max_capacity > 1 * GB) {
    180     std::ostringstream oss;
    181     oss << "Maxium code cache capacity is limited to 1 GB, "
    182         << PrettySize(max_capacity) << " is too big";
    183     *error_msg = oss.str();
    184     return nullptr;
    185   }
    186 
    187   // Decide how we should map the code and data sections.
    188   // If we use the code cache just for profiling we do not need to map the code section as
    189   // executable.
    190   // NOTE 1: this is yet another workaround to bypass strict SElinux policies in order to be able
    191   //         to profile system server.
    192   // NOTE 2: We could just not create the code section at all but we will need to
    193   //         special case too many cases.
    194   int memmap_flags_prot_code = used_only_for_profile_data ? (kProtCode & ~PROT_EXEC) : kProtCode;
    195 
    196   std::string error_str;
    197   // Map name specific for android_os_Debug.cpp accounting.
    198   // Map in low 4gb to simplify accessing root tables for x86_64.
    199   // We could do PC-relative addressing to avoid this problem, but that
    200   // would require reserving code and data area before submitting, which
    201   // means more windows for the code memory to be RWX.
    202   std::unique_ptr<MemMap> data_map(MemMap::MapAnonymous(
    203       "data-code-cache", nullptr,
    204       max_capacity,
    205       kProtData,
    206       /* low_4gb */ true,
    207       /* reuse */ false,
    208       &error_str,
    209       use_ashmem));
    210   if (data_map == nullptr) {
    211     std::ostringstream oss;
    212     oss << "Failed to create read write cache: " << error_str << " size=" << max_capacity;
    213     *error_msg = oss.str();
    214     return nullptr;
    215   }
    216 
    217   // Align both capacities to page size, as that's the unit mspaces use.
    218   initial_capacity = RoundDown(initial_capacity, 2 * kPageSize);
    219   max_capacity = RoundDown(max_capacity, 2 * kPageSize);
    220 
    221   // Data cache is 1 / 2 of the map.
    222   // TODO: Make this variable?
    223   size_t data_size = max_capacity / 2;
    224   size_t code_size = max_capacity - data_size;
    225   DCHECK_EQ(code_size + data_size, max_capacity);
    226   uint8_t* divider = data_map->Begin() + data_size;
    227 
    228   MemMap* code_map = data_map->RemapAtEnd(
    229       divider,
    230       "jit-code-cache",
    231       memmap_flags_prot_code | PROT_WRITE,
    232       &error_str, use_ashmem);
    233   if (code_map == nullptr) {
    234     std::ostringstream oss;
    235     oss << "Failed to create read write execute cache: " << error_str << " size=" << max_capacity;
    236     *error_msg = oss.str();
    237     return nullptr;
    238   }
    239   DCHECK_EQ(code_map->Begin(), divider);
    240   data_size = initial_capacity / 2;
    241   code_size = initial_capacity - data_size;
    242   DCHECK_EQ(code_size + data_size, initial_capacity);
    243   return new JitCodeCache(
    244       code_map,
    245       data_map.release(),
    246       code_size,
    247       data_size,
    248       max_capacity,
    249       garbage_collect_code,
    250       memmap_flags_prot_code);
    251 }
    252 
    253 JitCodeCache::JitCodeCache(MemMap* code_map,
    254                            MemMap* data_map,
    255                            size_t initial_code_capacity,
    256                            size_t initial_data_capacity,
    257                            size_t max_capacity,
    258                            bool garbage_collect_code,
    259                            int memmap_flags_prot_code)
    260     : lock_("Jit code cache", kJitCodeCacheLock),
    261       lock_cond_("Jit code cache condition variable", lock_),
    262       collection_in_progress_(false),
    263       code_map_(code_map),
    264       data_map_(data_map),
    265       max_capacity_(max_capacity),
    266       current_capacity_(initial_code_capacity + initial_data_capacity),
    267       code_end_(initial_code_capacity),
    268       data_end_(initial_data_capacity),
    269       last_collection_increased_code_cache_(false),
    270       last_update_time_ns_(0),
    271       garbage_collect_code_(garbage_collect_code),
    272       used_memory_for_data_(0),
    273       used_memory_for_code_(0),
    274       number_of_compilations_(0),
    275       number_of_osr_compilations_(0),
    276       number_of_collections_(0),
    277       histogram_stack_map_memory_use_("Memory used for stack maps", 16),
    278       histogram_code_memory_use_("Memory used for compiled code", 16),
    279       histogram_profiling_info_memory_use_("Memory used for profiling info", 16),
    280       is_weak_access_enabled_(true),
    281       inline_cache_cond_("Jit inline cache condition variable", lock_),
    282       memmap_flags_prot_code_(memmap_flags_prot_code) {
    283 
    284   DCHECK_GE(max_capacity, initial_code_capacity + initial_data_capacity);
    285   code_mspace_ = create_mspace_with_base(code_map_->Begin(), code_end_, false /*locked*/);
    286   data_mspace_ = create_mspace_with_base(data_map_->Begin(), data_end_, false /*locked*/);
    287 
    288   if (code_mspace_ == nullptr || data_mspace_ == nullptr) {
    289     PLOG(FATAL) << "create_mspace_with_base failed";
    290   }
    291 
    292   SetFootprintLimit(current_capacity_);
    293 
    294   CheckedCall(mprotect,
    295               "mprotect jit code cache",
    296               code_map_->Begin(),
    297               code_map_->Size(),
    298               memmap_flags_prot_code_);
    299   CheckedCall(mprotect,
    300               "mprotect jit data cache",
    301               data_map_->Begin(),
    302               data_map_->Size(),
    303               kProtData);
    304 
    305   VLOG(jit) << "Created jit code cache: initial data size="
    306             << PrettySize(initial_data_capacity)
    307             << ", initial code size="
    308             << PrettySize(initial_code_capacity);
    309 }
    310 
    311 JitCodeCache::~JitCodeCache() {}
    312 
    313 bool JitCodeCache::ContainsPc(const void* ptr) const {
    314   return code_map_->Begin() <= ptr && ptr < code_map_->End();
    315 }
    316 
    317 bool JitCodeCache::ContainsMethod(ArtMethod* method) {
    318   MutexLock mu(Thread::Current(), lock_);
    319   if (UNLIKELY(method->IsNative())) {
    320     auto it = jni_stubs_map_.find(JniStubKey(method));
    321     if (it != jni_stubs_map_.end() &&
    322         it->second.IsCompiled() &&
    323         ContainsElement(it->second.GetMethods(), method)) {
    324       return true;
    325     }
    326   } else {
    327     for (const auto& it : method_code_map_) {
    328       if (it.second == method) {
    329         return true;
    330       }
    331     }
    332   }
    333   return false;
    334 }
    335 
    336 const void* JitCodeCache::GetJniStubCode(ArtMethod* method) {
    337   DCHECK(method->IsNative());
    338   MutexLock mu(Thread::Current(), lock_);
    339   auto it = jni_stubs_map_.find(JniStubKey(method));
    340   if (it != jni_stubs_map_.end()) {
    341     JniStubData& data = it->second;
    342     if (data.IsCompiled() && ContainsElement(data.GetMethods(), method)) {
    343       return data.GetCode();
    344     }
    345   }
    346   return nullptr;
    347 }
    348 
    349 class ScopedCodeCacheWrite : ScopedTrace {
    350  public:
    351   explicit ScopedCodeCacheWrite(const JitCodeCache* const code_cache,
    352                                 bool only_for_tlb_shootdown = false)
    353       : ScopedTrace("ScopedCodeCacheWrite"),
    354         code_cache_(code_cache),
    355         only_for_tlb_shootdown_(only_for_tlb_shootdown) {
    356     ScopedTrace trace("mprotect all");
    357     CheckedCall(
    358         mprotect,
    359         "make code writable",
    360         code_cache_->code_map_->Begin(),
    361         only_for_tlb_shootdown_ ? kPageSize : code_cache_->code_map_->Size(),
    362         code_cache_->memmap_flags_prot_code_ | PROT_WRITE);
    363   }
    364 
    365   ~ScopedCodeCacheWrite() {
    366     ScopedTrace trace("mprotect code");
    367     CheckedCall(
    368         mprotect,
    369         "make code protected",
    370         code_cache_->code_map_->Begin(),
    371         only_for_tlb_shootdown_ ? kPageSize : code_cache_->code_map_->Size(),
    372         code_cache_->memmap_flags_prot_code_);
    373   }
    374 
    375  private:
    376   const JitCodeCache* const code_cache_;
    377 
    378   // If we're using ScopedCacheWrite only for TLB shootdown, we limit the scope of mprotect to
    379   // one page.
    380   const bool only_for_tlb_shootdown_;
    381 
    382   DISALLOW_COPY_AND_ASSIGN(ScopedCodeCacheWrite);
    383 };
    384 
    385 uint8_t* JitCodeCache::CommitCode(Thread* self,
    386                                   ArtMethod* method,
    387                                   uint8_t* stack_map,
    388                                   uint8_t* method_info,
    389                                   uint8_t* roots_data,
    390                                   size_t frame_size_in_bytes,
    391                                   size_t core_spill_mask,
    392                                   size_t fp_spill_mask,
    393                                   const uint8_t* code,
    394                                   size_t code_size,
    395                                   size_t data_size,
    396                                   bool osr,
    397                                   Handle<mirror::ObjectArray<mirror::Object>> roots,
    398                                   bool has_should_deoptimize_flag,
    399                                   const ArenaSet<ArtMethod*>& cha_single_implementation_list) {
    400   uint8_t* result = CommitCodeInternal(self,
    401                                        method,
    402                                        stack_map,
    403                                        method_info,
    404                                        roots_data,
    405                                        frame_size_in_bytes,
    406                                        core_spill_mask,
    407                                        fp_spill_mask,
    408                                        code,
    409                                        code_size,
    410                                        data_size,
    411                                        osr,
    412                                        roots,
    413                                        has_should_deoptimize_flag,
    414                                        cha_single_implementation_list);
    415   if (result == nullptr) {
    416     // Retry.
    417     GarbageCollectCache(self);
    418     result = CommitCodeInternal(self,
    419                                 method,
    420                                 stack_map,
    421                                 method_info,
    422                                 roots_data,
    423                                 frame_size_in_bytes,
    424                                 core_spill_mask,
    425                                 fp_spill_mask,
    426                                 code,
    427                                 code_size,
    428                                 data_size,
    429                                 osr,
    430                                 roots,
    431                                 has_should_deoptimize_flag,
    432                                 cha_single_implementation_list);
    433   }
    434   return result;
    435 }
    436 
    437 bool JitCodeCache::WaitForPotentialCollectionToComplete(Thread* self) {
    438   bool in_collection = false;
    439   while (collection_in_progress_) {
    440     in_collection = true;
    441     lock_cond_.Wait(self);
    442   }
    443   return in_collection;
    444 }
    445 
    446 static uintptr_t FromCodeToAllocation(const void* code) {
    447   size_t alignment = GetInstructionSetAlignment(kRuntimeISA);
    448   return reinterpret_cast<uintptr_t>(code) - RoundUp(sizeof(OatQuickMethodHeader), alignment);
    449 }
    450 
    451 static uint32_t ComputeRootTableSize(uint32_t number_of_roots) {
    452   return sizeof(uint32_t) + number_of_roots * sizeof(GcRoot<mirror::Object>);
    453 }
    454 
    455 static uint32_t GetNumberOfRoots(const uint8_t* stack_map) {
    456   // The length of the table is stored just before the stack map (and therefore at the end of
    457   // the table itself), in order to be able to fetch it from a `stack_map` pointer.
    458   return reinterpret_cast<const uint32_t*>(stack_map)[-1];
    459 }
    460 
    461 static void FillRootTableLength(uint8_t* roots_data, uint32_t length) {
    462   // Store the length of the table at the end. This will allow fetching it from a `stack_map`
    463   // pointer.
    464   reinterpret_cast<uint32_t*>(roots_data)[length] = length;
    465 }
    466 
    467 static const uint8_t* FromStackMapToRoots(const uint8_t* stack_map_data) {
    468   return stack_map_data - ComputeRootTableSize(GetNumberOfRoots(stack_map_data));
    469 }
    470 
    471 static void FillRootTable(uint8_t* roots_data, Handle<mirror::ObjectArray<mirror::Object>> roots)
    472     REQUIRES_SHARED(Locks::mutator_lock_) {
    473   GcRoot<mirror::Object>* gc_roots = reinterpret_cast<GcRoot<mirror::Object>*>(roots_data);
    474   const uint32_t length = roots->GetLength();
    475   // Put all roots in `roots_data`.
    476   for (uint32_t i = 0; i < length; ++i) {
    477     ObjPtr<mirror::Object> object = roots->Get(i);
    478     if (kIsDebugBuild) {
    479       // Ensure the string is strongly interned. b/32995596
    480       if (object->IsString()) {
    481         ObjPtr<mirror::String> str = reinterpret_cast<mirror::String*>(object.Ptr());
    482         ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    483         CHECK(class_linker->GetInternTable()->LookupStrong(Thread::Current(), str) != nullptr);
    484       }
    485     }
    486     gc_roots[i] = GcRoot<mirror::Object>(object);
    487   }
    488 }
    489 
    490 static uint8_t* GetRootTable(const void* code_ptr, uint32_t* number_of_roots = nullptr) {
    491   OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
    492   uint8_t* data = method_header->GetOptimizedCodeInfoPtr();
    493   uint32_t roots = GetNumberOfRoots(data);
    494   if (number_of_roots != nullptr) {
    495     *number_of_roots = roots;
    496   }
    497   return data - ComputeRootTableSize(roots);
    498 }
    499 
    500 // Use a sentinel for marking entries in the JIT table that have been cleared.
    501 // This helps diagnosing in case the compiled code tries to wrongly access such
    502 // entries.
    503 static mirror::Class* const weak_sentinel =
    504     reinterpret_cast<mirror::Class*>(Context::kBadGprBase + 0xff);
    505 
    506 // Helper for the GC to process a weak class in a JIT root table.
    507 static inline void ProcessWeakClass(GcRoot<mirror::Class>* root_ptr,
    508                                     IsMarkedVisitor* visitor,
    509                                     mirror::Class* update)
    510     REQUIRES_SHARED(Locks::mutator_lock_) {
    511   // This does not need a read barrier because this is called by GC.
    512   mirror::Class* cls = root_ptr->Read<kWithoutReadBarrier>();
    513   if (cls != nullptr && cls != weak_sentinel) {
    514     DCHECK((cls->IsClass<kDefaultVerifyFlags, kWithoutReadBarrier>()));
    515     // Look at the classloader of the class to know if it has been unloaded.
    516     // This does not need a read barrier because this is called by GC.
    517     mirror::Object* class_loader =
    518         cls->GetClassLoader<kDefaultVerifyFlags, kWithoutReadBarrier>();
    519     if (class_loader == nullptr || visitor->IsMarked(class_loader) != nullptr) {
    520       // The class loader is live, update the entry if the class has moved.
    521       mirror::Class* new_cls = down_cast<mirror::Class*>(visitor->IsMarked(cls));
    522       // Note that new_object can be null for CMS and newly allocated objects.
    523       if (new_cls != nullptr && new_cls != cls) {
    524         *root_ptr = GcRoot<mirror::Class>(new_cls);
    525       }
    526     } else {
    527       // The class loader is not live, clear the entry.
    528       *root_ptr = GcRoot<mirror::Class>(update);
    529     }
    530   }
    531 }
    532 
    533 void JitCodeCache::SweepRootTables(IsMarkedVisitor* visitor) {
    534   MutexLock mu(Thread::Current(), lock_);
    535   for (const auto& entry : method_code_map_) {
    536     uint32_t number_of_roots = 0;
    537     uint8_t* roots_data = GetRootTable(entry.first, &number_of_roots);
    538     GcRoot<mirror::Object>* roots = reinterpret_cast<GcRoot<mirror::Object>*>(roots_data);
    539     for (uint32_t i = 0; i < number_of_roots; ++i) {
    540       // This does not need a read barrier because this is called by GC.
    541       mirror::Object* object = roots[i].Read<kWithoutReadBarrier>();
    542       if (object == nullptr || object == weak_sentinel) {
    543         // entry got deleted in a previous sweep.
    544       } else if (object->IsString<kDefaultVerifyFlags, kWithoutReadBarrier>()) {
    545         mirror::Object* new_object = visitor->IsMarked(object);
    546         // We know the string is marked because it's a strongly-interned string that
    547         // is always alive. The IsMarked implementation of the CMS collector returns
    548         // null for newly allocated objects, but we know those haven't moved. Therefore,
    549         // only update the entry if we get a different non-null string.
    550         // TODO: Do not use IsMarked for j.l.Class, and adjust once we move this method
    551         // out of the weak access/creation pause. b/32167580
    552         if (new_object != nullptr && new_object != object) {
    553           DCHECK(new_object->IsString());
    554           roots[i] = GcRoot<mirror::Object>(new_object);
    555         }
    556       } else {
    557         ProcessWeakClass(
    558             reinterpret_cast<GcRoot<mirror::Class>*>(&roots[i]), visitor, weak_sentinel);
    559       }
    560     }
    561   }
    562   // Walk over inline caches to clear entries containing unloaded classes.
    563   for (ProfilingInfo* info : profiling_infos_) {
    564     for (size_t i = 0; i < info->number_of_inline_caches_; ++i) {
    565       InlineCache* cache = &info->cache_[i];
    566       for (size_t j = 0; j < InlineCache::kIndividualCacheSize; ++j) {
    567         ProcessWeakClass(&cache->classes_[j], visitor, nullptr);
    568       }
    569     }
    570   }
    571 }
    572 
    573 void JitCodeCache::FreeCode(const void* code_ptr) {
    574   uintptr_t allocation = FromCodeToAllocation(code_ptr);
    575   // Notify native debugger that we are about to remove the code.
    576   // It does nothing if we are not using native debugger.
    577   MutexLock mu(Thread::Current(), *Locks::native_debug_interface_lock_);
    578   RemoveNativeDebugInfoForJit(code_ptr);
    579   if (OatQuickMethodHeader::FromCodePointer(code_ptr)->IsOptimized()) {
    580     FreeData(GetRootTable(code_ptr));
    581   }  // else this is a JNI stub without any data.
    582   FreeCode(reinterpret_cast<uint8_t*>(allocation));
    583 }
    584 
    585 void JitCodeCache::FreeAllMethodHeaders(
    586     const std::unordered_set<OatQuickMethodHeader*>& method_headers) {
    587   {
    588     MutexLock mu(Thread::Current(), *Locks::cha_lock_);
    589     Runtime::Current()->GetClassLinker()->GetClassHierarchyAnalysis()
    590         ->RemoveDependentsWithMethodHeaders(method_headers);
    591   }
    592 
    593   // We need to remove entries in method_headers from CHA dependencies
    594   // first since once we do FreeCode() below, the memory can be reused
    595   // so it's possible for the same method_header to start representing
    596   // different compile code.
    597   MutexLock mu(Thread::Current(), lock_);
    598   ScopedCodeCacheWrite scc(this);
    599   for (const OatQuickMethodHeader* method_header : method_headers) {
    600     FreeCode(method_header->GetCode());
    601   }
    602 }
    603 
    604 void JitCodeCache::RemoveMethodsIn(Thread* self, const LinearAlloc& alloc) {
    605   ScopedTrace trace(__PRETTY_FUNCTION__);
    606   // We use a set to first collect all method_headers whose code need to be
    607   // removed. We need to free the underlying code after we remove CHA dependencies
    608   // for entries in this set. And it's more efficient to iterate through
    609   // the CHA dependency map just once with an unordered_set.
    610   std::unordered_set<OatQuickMethodHeader*> method_headers;
    611   {
    612     MutexLock mu(self, lock_);
    613     // We do not check if a code cache GC is in progress, as this method comes
    614     // with the classlinker_classes_lock_ held, and suspending ourselves could
    615     // lead to a deadlock.
    616     {
    617       ScopedCodeCacheWrite scc(this);
    618       for (auto it = jni_stubs_map_.begin(); it != jni_stubs_map_.end();) {
    619         it->second.RemoveMethodsIn(alloc);
    620         if (it->second.GetMethods().empty()) {
    621           method_headers.insert(OatQuickMethodHeader::FromCodePointer(it->second.GetCode()));
    622           it = jni_stubs_map_.erase(it);
    623         } else {
    624           it->first.UpdateShorty(it->second.GetMethods().front());
    625           ++it;
    626         }
    627       }
    628       for (auto it = method_code_map_.begin(); it != method_code_map_.end();) {
    629         if (alloc.ContainsUnsafe(it->second)) {
    630           method_headers.insert(OatQuickMethodHeader::FromCodePointer(it->first));
    631           it = method_code_map_.erase(it);
    632         } else {
    633           ++it;
    634         }
    635       }
    636     }
    637     for (auto it = osr_code_map_.begin(); it != osr_code_map_.end();) {
    638       if (alloc.ContainsUnsafe(it->first)) {
    639         // Note that the code has already been pushed to method_headers in the loop
    640         // above and is going to be removed in FreeCode() below.
    641         it = osr_code_map_.erase(it);
    642       } else {
    643         ++it;
    644       }
    645     }
    646     for (auto it = profiling_infos_.begin(); it != profiling_infos_.end();) {
    647       ProfilingInfo* info = *it;
    648       if (alloc.ContainsUnsafe(info->GetMethod())) {
    649         info->GetMethod()->SetProfilingInfo(nullptr);
    650         FreeData(reinterpret_cast<uint8_t*>(info));
    651         it = profiling_infos_.erase(it);
    652       } else {
    653         ++it;
    654       }
    655     }
    656   }
    657   FreeAllMethodHeaders(method_headers);
    658 }
    659 
    660 bool JitCodeCache::IsWeakAccessEnabled(Thread* self) const {
    661   return kUseReadBarrier
    662       ? self->GetWeakRefAccessEnabled()
    663       : is_weak_access_enabled_.LoadSequentiallyConsistent();
    664 }
    665 
    666 void JitCodeCache::WaitUntilInlineCacheAccessible(Thread* self) {
    667   if (IsWeakAccessEnabled(self)) {
    668     return;
    669   }
    670   ScopedThreadSuspension sts(self, kWaitingWeakGcRootRead);
    671   MutexLock mu(self, lock_);
    672   while (!IsWeakAccessEnabled(self)) {
    673     inline_cache_cond_.Wait(self);
    674   }
    675 }
    676 
    677 void JitCodeCache::BroadcastForInlineCacheAccess() {
    678   Thread* self = Thread::Current();
    679   MutexLock mu(self, lock_);
    680   inline_cache_cond_.Broadcast(self);
    681 }
    682 
    683 void JitCodeCache::AllowInlineCacheAccess() {
    684   DCHECK(!kUseReadBarrier);
    685   is_weak_access_enabled_.StoreSequentiallyConsistent(true);
    686   BroadcastForInlineCacheAccess();
    687 }
    688 
    689 void JitCodeCache::DisallowInlineCacheAccess() {
    690   DCHECK(!kUseReadBarrier);
    691   is_weak_access_enabled_.StoreSequentiallyConsistent(false);
    692 }
    693 
    694 void JitCodeCache::CopyInlineCacheInto(const InlineCache& ic,
    695                                        Handle<mirror::ObjectArray<mirror::Class>> array) {
    696   WaitUntilInlineCacheAccessible(Thread::Current());
    697   // Note that we don't need to lock `lock_` here, the compiler calling
    698   // this method has already ensured the inline cache will not be deleted.
    699   for (size_t in_cache = 0, in_array = 0;
    700        in_cache < InlineCache::kIndividualCacheSize;
    701        ++in_cache) {
    702     mirror::Class* object = ic.classes_[in_cache].Read();
    703     if (object != nullptr) {
    704       array->Set(in_array++, object);
    705     }
    706   }
    707 }
    708 
    709 static void ClearMethodCounter(ArtMethod* method, bool was_warm) {
    710   if (was_warm) {
    711     // Don't do any read barrier, as the declaring class of `method` may
    712     // be in the process of being GC'ed (reading the declaring class is done
    713     // when DCHECKing the declaring class is resolved, which we know it is
    714     // at this point).
    715     method->SetPreviouslyWarm<kWithoutReadBarrier>();
    716   }
    717   // We reset the counter to 1 so that the profile knows that the method was executed at least once.
    718   // This is required for layout purposes.
    719   // We also need to make sure we'll pass the warmup threshold again, so we set to 0 if
    720   // the warmup threshold is 1.
    721   uint16_t jit_warmup_threshold = Runtime::Current()->GetJITOptions()->GetWarmupThreshold();
    722   method->SetCounter(std::min(jit_warmup_threshold - 1, 1));
    723 }
    724 
    725 uint8_t* JitCodeCache::CommitCodeInternal(Thread* self,
    726                                           ArtMethod* method,
    727                                           uint8_t* stack_map,
    728                                           uint8_t* method_info,
    729                                           uint8_t* roots_data,
    730                                           size_t frame_size_in_bytes,
    731                                           size_t core_spill_mask,
    732                                           size_t fp_spill_mask,
    733                                           const uint8_t* code,
    734                                           size_t code_size,
    735                                           size_t data_size,
    736                                           bool osr,
    737                                           Handle<mirror::ObjectArray<mirror::Object>> roots,
    738                                           bool has_should_deoptimize_flag,
    739                                           const ArenaSet<ArtMethod*>&
    740                                               cha_single_implementation_list) {
    741   DCHECK_NE(stack_map != nullptr, method->IsNative());
    742   DCHECK(!method->IsNative() || !osr);
    743   size_t alignment = GetInstructionSetAlignment(kRuntimeISA);
    744   // Ensure the header ends up at expected instruction alignment.
    745   size_t header_size = RoundUp(sizeof(OatQuickMethodHeader), alignment);
    746   size_t total_size = header_size + code_size;
    747 
    748   OatQuickMethodHeader* method_header = nullptr;
    749   uint8_t* code_ptr = nullptr;
    750   uint8_t* memory = nullptr;
    751   {
    752     ScopedThreadSuspension sts(self, kSuspended);
    753     MutexLock mu(self, lock_);
    754     WaitForPotentialCollectionToComplete(self);
    755     {
    756       ScopedCodeCacheWrite scc(this);
    757       memory = AllocateCode(total_size);
    758       if (memory == nullptr) {
    759         return nullptr;
    760       }
    761       code_ptr = memory + header_size;
    762 
    763       std::copy(code, code + code_size, code_ptr);
    764       method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
    765       new (method_header) OatQuickMethodHeader(
    766           (stack_map != nullptr) ? code_ptr - stack_map : 0u,
    767           (method_info != nullptr) ? code_ptr - method_info : 0u,
    768           frame_size_in_bytes,
    769           core_spill_mask,
    770           fp_spill_mask,
    771           code_size);
    772       // Flush caches before we remove write permission because some ARMv8 Qualcomm kernels may
    773       // trigger a segfault if a page fault occurs when requesting a cache maintenance operation.
    774       // This is a kernel bug that we need to work around until affected devices (e.g. Nexus 5X and
    775       // 6P) stop being supported or their kernels are fixed.
    776       //
    777       // For reference, this behavior is caused by this commit:
    778       // https://android.googlesource.com/kernel/msm/+/3fbe6bc28a6b9939d0650f2f17eb5216c719950c
    779       FlushInstructionCache(reinterpret_cast<char*>(code_ptr),
    780                             reinterpret_cast<char*>(code_ptr + code_size));
    781       DCHECK(!Runtime::Current()->IsAotCompiler());
    782       if (has_should_deoptimize_flag) {
    783         method_header->SetHasShouldDeoptimizeFlag();
    784       }
    785     }
    786 
    787     number_of_compilations_++;
    788   }
    789   // We need to update the entry point in the runnable state for the instrumentation.
    790   {
    791     // Need cha_lock_ for checking all single-implementation flags and register
    792     // dependencies.
    793     MutexLock cha_mu(self, *Locks::cha_lock_);
    794     bool single_impl_still_valid = true;
    795     for (ArtMethod* single_impl : cha_single_implementation_list) {
    796       if (!single_impl->HasSingleImplementation()) {
    797         // Simply discard the compiled code. Clear the counter so that it may be recompiled later.
    798         // Hopefully the class hierarchy will be more stable when compilation is retried.
    799         single_impl_still_valid = false;
    800         ClearMethodCounter(method, /*was_warm*/ false);
    801         break;
    802       }
    803     }
    804 
    805     // Discard the code if any single-implementation assumptions are now invalid.
    806     if (!single_impl_still_valid) {
    807       VLOG(jit) << "JIT discarded jitted code due to invalid single-implementation assumptions.";
    808       return nullptr;
    809     }
    810     DCHECK(cha_single_implementation_list.empty() || !Runtime::Current()->IsJavaDebuggable())
    811         << "Should not be using cha on debuggable apps/runs!";
    812 
    813     for (ArtMethod* single_impl : cha_single_implementation_list) {
    814       Runtime::Current()->GetClassLinker()->GetClassHierarchyAnalysis()->AddDependency(
    815           single_impl, method, method_header);
    816     }
    817 
    818     // The following needs to be guarded by cha_lock_ also. Otherwise it's
    819     // possible that the compiled code is considered invalidated by some class linking,
    820     // but below we still make the compiled code valid for the method.
    821     MutexLock mu(self, lock_);
    822     if (UNLIKELY(method->IsNative())) {
    823       DCHECK(stack_map == nullptr);
    824       DCHECK(roots_data == nullptr);
    825       auto it = jni_stubs_map_.find(JniStubKey(method));
    826       DCHECK(it != jni_stubs_map_.end())
    827           << "Entry inserted in NotifyCompilationOf() should be alive.";
    828       JniStubData* data = &it->second;
    829       DCHECK(ContainsElement(data->GetMethods(), method))
    830           << "Entry inserted in NotifyCompilationOf() should contain this method.";
    831       data->SetCode(code_ptr);
    832       instrumentation::Instrumentation* instrum = Runtime::Current()->GetInstrumentation();
    833       for (ArtMethod* m : data->GetMethods()) {
    834         instrum->UpdateMethodsCode(m, method_header->GetEntryPoint());
    835       }
    836     } else {
    837       // Fill the root table before updating the entry point.
    838       DCHECK_EQ(FromStackMapToRoots(stack_map), roots_data);
    839       DCHECK_LE(roots_data, stack_map);
    840       FillRootTable(roots_data, roots);
    841       {
    842         // Flush data cache, as compiled code references literals in it.
    843         // We also need a TLB shootdown to act as memory barrier across cores.
    844         ScopedCodeCacheWrite ccw(this, /* only_for_tlb_shootdown */ true);
    845         FlushDataCache(reinterpret_cast<char*>(roots_data),
    846                        reinterpret_cast<char*>(roots_data + data_size));
    847       }
    848       method_code_map_.Put(code_ptr, method);
    849       if (osr) {
    850         number_of_osr_compilations_++;
    851         osr_code_map_.Put(method, code_ptr);
    852       } else {
    853         Runtime::Current()->GetInstrumentation()->UpdateMethodsCode(
    854             method, method_header->GetEntryPoint());
    855       }
    856     }
    857     if (collection_in_progress_) {
    858       // We need to update the live bitmap if there is a GC to ensure it sees this new
    859       // code.
    860       GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
    861     }
    862     last_update_time_ns_.StoreRelease(NanoTime());
    863     VLOG(jit)
    864         << "JIT added (osr=" << std::boolalpha << osr << std::noboolalpha << ") "
    865         << ArtMethod::PrettyMethod(method) << "@" << method
    866         << " ccache_size=" << PrettySize(CodeCacheSizeLocked()) << ": "
    867         << " dcache_size=" << PrettySize(DataCacheSizeLocked()) << ": "
    868         << reinterpret_cast<const void*>(method_header->GetEntryPoint()) << ","
    869         << reinterpret_cast<const void*>(method_header->GetEntryPoint() +
    870                                          method_header->GetCodeSize());
    871     histogram_code_memory_use_.AddValue(code_size);
    872     if (code_size > kCodeSizeLogThreshold) {
    873       LOG(INFO) << "JIT allocated "
    874                 << PrettySize(code_size)
    875                 << " for compiled code of "
    876                 << ArtMethod::PrettyMethod(method);
    877     }
    878   }
    879 
    880   return reinterpret_cast<uint8_t*>(method_header);
    881 }
    882 
    883 size_t JitCodeCache::CodeCacheSize() {
    884   MutexLock mu(Thread::Current(), lock_);
    885   return CodeCacheSizeLocked();
    886 }
    887 
    888 bool JitCodeCache::RemoveMethod(ArtMethod* method, bool release_memory) {
    889   // This function is used only for testing and only with non-native methods.
    890   CHECK(!method->IsNative());
    891 
    892   MutexLock mu(Thread::Current(), lock_);
    893 
    894   bool osr = osr_code_map_.find(method) != osr_code_map_.end();
    895   bool in_cache = RemoveMethodLocked(method, release_memory);
    896 
    897   if (!in_cache) {
    898     return false;
    899   }
    900 
    901   method->ClearCounter();
    902   Runtime::Current()->GetInstrumentation()->UpdateMethodsCode(
    903       method, GetQuickToInterpreterBridge());
    904   VLOG(jit)
    905       << "JIT removed (osr=" << std::boolalpha << osr << std::noboolalpha << ") "
    906       << ArtMethod::PrettyMethod(method) << "@" << method
    907       << " ccache_size=" << PrettySize(CodeCacheSizeLocked()) << ": "
    908       << " dcache_size=" << PrettySize(DataCacheSizeLocked());
    909   return true;
    910 }
    911 
    912 bool JitCodeCache::RemoveMethodLocked(ArtMethod* method, bool release_memory) {
    913   if (LIKELY(!method->IsNative())) {
    914     ProfilingInfo* info = method->GetProfilingInfo(kRuntimePointerSize);
    915     if (info != nullptr) {
    916       RemoveElement(profiling_infos_, info);
    917     }
    918     method->SetProfilingInfo(nullptr);
    919   }
    920 
    921   bool in_cache = false;
    922   ScopedCodeCacheWrite ccw(this);
    923   if (UNLIKELY(method->IsNative())) {
    924     auto it = jni_stubs_map_.find(JniStubKey(method));
    925     if (it != jni_stubs_map_.end() && it->second.RemoveMethod(method)) {
    926       in_cache = true;
    927       if (it->second.GetMethods().empty()) {
    928         if (release_memory) {
    929           FreeCode(it->second.GetCode());
    930         }
    931         jni_stubs_map_.erase(it);
    932       } else {
    933         it->first.UpdateShorty(it->second.GetMethods().front());
    934       }
    935     }
    936   } else {
    937     for (auto it = method_code_map_.begin(); it != method_code_map_.end();) {
    938       if (it->second == method) {
    939         in_cache = true;
    940         if (release_memory) {
    941           FreeCode(it->first);
    942         }
    943         it = method_code_map_.erase(it);
    944       } else {
    945         ++it;
    946       }
    947     }
    948 
    949     auto osr_it = osr_code_map_.find(method);
    950     if (osr_it != osr_code_map_.end()) {
    951       osr_code_map_.erase(osr_it);
    952     }
    953   }
    954 
    955   return in_cache;
    956 }
    957 
    958 // This notifies the code cache that the given method has been redefined and that it should remove
    959 // any cached information it has on the method. All threads must be suspended before calling this
    960 // method. The compiled code for the method (if there is any) must not be in any threads call stack.
    961 void JitCodeCache::NotifyMethodRedefined(ArtMethod* method) {
    962   MutexLock mu(Thread::Current(), lock_);
    963   RemoveMethodLocked(method, /* release_memory */ true);
    964 }
    965 
    966 // This invalidates old_method. Once this function returns one can no longer use old_method to
    967 // execute code unless it is fixed up. This fixup will happen later in the process of installing a
    968 // class redefinition.
    969 // TODO We should add some info to ArtMethod to note that 'old_method' has been invalidated and
    970 // shouldn't be used since it is no longer logically in the jit code cache.
    971 // TODO We should add DCHECKS that validate that the JIT is paused when this method is entered.
    972 void JitCodeCache::MoveObsoleteMethod(ArtMethod* old_method, ArtMethod* new_method) {
    973   MutexLock mu(Thread::Current(), lock_);
    974   if (old_method->IsNative()) {
    975     // Update methods in jni_stubs_map_.
    976     for (auto& entry : jni_stubs_map_) {
    977       JniStubData& data = entry.second;
    978       data.MoveObsoleteMethod(old_method, new_method);
    979     }
    980     return;
    981   }
    982   // Update ProfilingInfo to the new one and remove it from the old_method.
    983   if (old_method->GetProfilingInfo(kRuntimePointerSize) != nullptr) {
    984     DCHECK_EQ(old_method->GetProfilingInfo(kRuntimePointerSize)->GetMethod(), old_method);
    985     ProfilingInfo* info = old_method->GetProfilingInfo(kRuntimePointerSize);
    986     old_method->SetProfilingInfo(nullptr);
    987     // Since the JIT should be paused and all threads suspended by the time this is called these
    988     // checks should always pass.
    989     DCHECK(!info->IsInUseByCompiler());
    990     new_method->SetProfilingInfo(info);
    991     info->method_ = new_method;
    992   }
    993   // Update method_code_map_ to point to the new method.
    994   for (auto& it : method_code_map_) {
    995     if (it.second == old_method) {
    996       it.second = new_method;
    997     }
    998   }
    999   // Update osr_code_map_ to point to the new method.
   1000   auto code_map = osr_code_map_.find(old_method);
   1001   if (code_map != osr_code_map_.end()) {
   1002     osr_code_map_.Put(new_method, code_map->second);
   1003     osr_code_map_.erase(old_method);
   1004   }
   1005 }
   1006 
   1007 size_t JitCodeCache::CodeCacheSizeLocked() {
   1008   return used_memory_for_code_;
   1009 }
   1010 
   1011 size_t JitCodeCache::DataCacheSize() {
   1012   MutexLock mu(Thread::Current(), lock_);
   1013   return DataCacheSizeLocked();
   1014 }
   1015 
   1016 size_t JitCodeCache::DataCacheSizeLocked() {
   1017   return used_memory_for_data_;
   1018 }
   1019 
   1020 void JitCodeCache::ClearData(Thread* self,
   1021                              uint8_t* stack_map_data,
   1022                              uint8_t* roots_data) {
   1023   DCHECK_EQ(FromStackMapToRoots(stack_map_data), roots_data);
   1024   MutexLock mu(self, lock_);
   1025   FreeData(reinterpret_cast<uint8_t*>(roots_data));
   1026 }
   1027 
   1028 size_t JitCodeCache::ReserveData(Thread* self,
   1029                                  size_t stack_map_size,
   1030                                  size_t method_info_size,
   1031                                  size_t number_of_roots,
   1032                                  ArtMethod* method,
   1033                                  uint8_t** stack_map_data,
   1034                                  uint8_t** method_info_data,
   1035                                  uint8_t** roots_data) {
   1036   size_t table_size = ComputeRootTableSize(number_of_roots);
   1037   size_t size = RoundUp(stack_map_size + method_info_size + table_size, sizeof(void*));
   1038   uint8_t* result = nullptr;
   1039 
   1040   {
   1041     ScopedThreadSuspension sts(self, kSuspended);
   1042     MutexLock mu(self, lock_);
   1043     WaitForPotentialCollectionToComplete(self);
   1044     result = AllocateData(size);
   1045   }
   1046 
   1047   if (result == nullptr) {
   1048     // Retry.
   1049     GarbageCollectCache(self);
   1050     ScopedThreadSuspension sts(self, kSuspended);
   1051     MutexLock mu(self, lock_);
   1052     WaitForPotentialCollectionToComplete(self);
   1053     result = AllocateData(size);
   1054   }
   1055 
   1056   MutexLock mu(self, lock_);
   1057   histogram_stack_map_memory_use_.AddValue(size);
   1058   if (size > kStackMapSizeLogThreshold) {
   1059     LOG(INFO) << "JIT allocated "
   1060               << PrettySize(size)
   1061               << " for stack maps of "
   1062               << ArtMethod::PrettyMethod(method);
   1063   }
   1064   if (result != nullptr) {
   1065     *roots_data = result;
   1066     *stack_map_data = result + table_size;
   1067     *method_info_data = *stack_map_data + stack_map_size;
   1068     FillRootTableLength(*roots_data, number_of_roots);
   1069     return size;
   1070   } else {
   1071     *roots_data = nullptr;
   1072     *stack_map_data = nullptr;
   1073     *method_info_data = nullptr;
   1074     return 0;
   1075   }
   1076 }
   1077 
   1078 class MarkCodeVisitor FINAL : public StackVisitor {
   1079  public:
   1080   MarkCodeVisitor(Thread* thread_in, JitCodeCache* code_cache_in)
   1081       : StackVisitor(thread_in, nullptr, StackVisitor::StackWalkKind::kSkipInlinedFrames),
   1082         code_cache_(code_cache_in),
   1083         bitmap_(code_cache_->GetLiveBitmap()) {}
   1084 
   1085   bool VisitFrame() OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
   1086     const OatQuickMethodHeader* method_header = GetCurrentOatQuickMethodHeader();
   1087     if (method_header == nullptr) {
   1088       return true;
   1089     }
   1090     const void* code = method_header->GetCode();
   1091     if (code_cache_->ContainsPc(code)) {
   1092       // Use the atomic set version, as multiple threads are executing this code.
   1093       bitmap_->AtomicTestAndSet(FromCodeToAllocation(code));
   1094     }
   1095     return true;
   1096   }
   1097 
   1098  private:
   1099   JitCodeCache* const code_cache_;
   1100   CodeCacheBitmap* const bitmap_;
   1101 };
   1102 
   1103 class MarkCodeClosure FINAL : public Closure {
   1104  public:
   1105   MarkCodeClosure(JitCodeCache* code_cache, Barrier* barrier)
   1106       : code_cache_(code_cache), barrier_(barrier) {}
   1107 
   1108   void Run(Thread* thread) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
   1109     ScopedTrace trace(__PRETTY_FUNCTION__);
   1110     DCHECK(thread == Thread::Current() || thread->IsSuspended());
   1111     MarkCodeVisitor visitor(thread, code_cache_);
   1112     visitor.WalkStack();
   1113     if (kIsDebugBuild) {
   1114       // The stack walking code queries the side instrumentation stack if it
   1115       // sees an instrumentation exit pc, so the JIT code of methods in that stack
   1116       // must have been seen. We sanity check this below.
   1117       for (const instrumentation::InstrumentationStackFrame& frame
   1118               : *thread->GetInstrumentationStack()) {
   1119         // The 'method_' in InstrumentationStackFrame is the one that has return_pc_ in
   1120         // its stack frame, it is not the method owning return_pc_. We just pass null to
   1121         // LookupMethodHeader: the method is only checked against in debug builds.
   1122         OatQuickMethodHeader* method_header =
   1123             code_cache_->LookupMethodHeader(frame.return_pc_, /* method */ nullptr);
   1124         if (method_header != nullptr) {
   1125           const void* code = method_header->GetCode();
   1126           CHECK(code_cache_->GetLiveBitmap()->Test(FromCodeToAllocation(code)));
   1127         }
   1128       }
   1129     }
   1130     barrier_->Pass(Thread::Current());
   1131   }
   1132 
   1133  private:
   1134   JitCodeCache* const code_cache_;
   1135   Barrier* const barrier_;
   1136 };
   1137 
   1138 void JitCodeCache::NotifyCollectionDone(Thread* self) {
   1139   collection_in_progress_ = false;
   1140   lock_cond_.Broadcast(self);
   1141 }
   1142 
   1143 void JitCodeCache::SetFootprintLimit(size_t new_footprint) {
   1144   size_t per_space_footprint = new_footprint / 2;
   1145   DCHECK(IsAlignedParam(per_space_footprint, kPageSize));
   1146   DCHECK_EQ(per_space_footprint * 2, new_footprint);
   1147   mspace_set_footprint_limit(data_mspace_, per_space_footprint);
   1148   {
   1149     ScopedCodeCacheWrite scc(this);
   1150     mspace_set_footprint_limit(code_mspace_, per_space_footprint);
   1151   }
   1152 }
   1153 
   1154 bool JitCodeCache::IncreaseCodeCacheCapacity() {
   1155   if (current_capacity_ == max_capacity_) {
   1156     return false;
   1157   }
   1158 
   1159   // Double the capacity if we're below 1MB, or increase it by 1MB if
   1160   // we're above.
   1161   if (current_capacity_ < 1 * MB) {
   1162     current_capacity_ *= 2;
   1163   } else {
   1164     current_capacity_ += 1 * MB;
   1165   }
   1166   if (current_capacity_ > max_capacity_) {
   1167     current_capacity_ = max_capacity_;
   1168   }
   1169 
   1170   VLOG(jit) << "Increasing code cache capacity to " << PrettySize(current_capacity_);
   1171 
   1172   SetFootprintLimit(current_capacity_);
   1173 
   1174   return true;
   1175 }
   1176 
   1177 void JitCodeCache::MarkCompiledCodeOnThreadStacks(Thread* self) {
   1178   Barrier barrier(0);
   1179   size_t threads_running_checkpoint = 0;
   1180   MarkCodeClosure closure(this, &barrier);
   1181   threads_running_checkpoint = Runtime::Current()->GetThreadList()->RunCheckpoint(&closure);
   1182   // Now that we have run our checkpoint, move to a suspended state and wait
   1183   // for other threads to run the checkpoint.
   1184   ScopedThreadSuspension sts(self, kSuspended);
   1185   if (threads_running_checkpoint != 0) {
   1186     barrier.Increment(self, threads_running_checkpoint);
   1187   }
   1188 }
   1189 
   1190 bool JitCodeCache::ShouldDoFullCollection() {
   1191   if (current_capacity_ == max_capacity_) {
   1192     // Always do a full collection when the code cache is full.
   1193     return true;
   1194   } else if (current_capacity_ < kReservedCapacity) {
   1195     // Always do partial collection when the code cache size is below the reserved
   1196     // capacity.
   1197     return false;
   1198   } else if (last_collection_increased_code_cache_) {
   1199     // This time do a full collection.
   1200     return true;
   1201   } else {
   1202     // This time do a partial collection.
   1203     return false;
   1204   }
   1205 }
   1206 
   1207 void JitCodeCache::GarbageCollectCache(Thread* self) {
   1208   ScopedTrace trace(__FUNCTION__);
   1209   if (!garbage_collect_code_) {
   1210     MutexLock mu(self, lock_);
   1211     IncreaseCodeCacheCapacity();
   1212     return;
   1213   }
   1214 
   1215   // Wait for an existing collection, or let everyone know we are starting one.
   1216   {
   1217     ScopedThreadSuspension sts(self, kSuspended);
   1218     MutexLock mu(self, lock_);
   1219     if (WaitForPotentialCollectionToComplete(self)) {
   1220       return;
   1221     } else {
   1222       number_of_collections_++;
   1223       live_bitmap_.reset(CodeCacheBitmap::Create(
   1224           "code-cache-bitmap",
   1225           reinterpret_cast<uintptr_t>(code_map_->Begin()),
   1226           reinterpret_cast<uintptr_t>(code_map_->Begin() + current_capacity_ / 2)));
   1227       collection_in_progress_ = true;
   1228     }
   1229   }
   1230 
   1231   TimingLogger logger("JIT code cache timing logger", true, VLOG_IS_ON(jit));
   1232   {
   1233     TimingLogger::ScopedTiming st("Code cache collection", &logger);
   1234 
   1235     bool do_full_collection = false;
   1236     {
   1237       MutexLock mu(self, lock_);
   1238       do_full_collection = ShouldDoFullCollection();
   1239     }
   1240 
   1241     VLOG(jit) << "Do "
   1242               << (do_full_collection ? "full" : "partial")
   1243               << " code cache collection, code="
   1244               << PrettySize(CodeCacheSize())
   1245               << ", data=" << PrettySize(DataCacheSize());
   1246 
   1247     DoCollection(self, /* collect_profiling_info */ do_full_collection);
   1248 
   1249     VLOG(jit) << "After code cache collection, code="
   1250               << PrettySize(CodeCacheSize())
   1251               << ", data=" << PrettySize(DataCacheSize());
   1252 
   1253     {
   1254       MutexLock mu(self, lock_);
   1255 
   1256       // Increase the code cache only when we do partial collections.
   1257       // TODO: base this strategy on how full the code cache is?
   1258       if (do_full_collection) {
   1259         last_collection_increased_code_cache_ = false;
   1260       } else {
   1261         last_collection_increased_code_cache_ = true;
   1262         IncreaseCodeCacheCapacity();
   1263       }
   1264 
   1265       bool next_collection_will_be_full = ShouldDoFullCollection();
   1266 
   1267       // Start polling the liveness of compiled code to prepare for the next full collection.
   1268       if (next_collection_will_be_full) {
   1269         // Save the entry point of methods we have compiled, and update the entry
   1270         // point of those methods to the interpreter. If the method is invoked, the
   1271         // interpreter will update its entry point to the compiled code and call it.
   1272         for (ProfilingInfo* info : profiling_infos_) {
   1273           const void* entry_point = info->GetMethod()->GetEntryPointFromQuickCompiledCode();
   1274           if (ContainsPc(entry_point)) {
   1275             info->SetSavedEntryPoint(entry_point);
   1276             // Don't call Instrumentation::UpdateMethodsCode(), as it can check the declaring
   1277             // class of the method. We may be concurrently running a GC which makes accessing
   1278             // the class unsafe. We know it is OK to bypass the instrumentation as we've just
   1279             // checked that the current entry point is JIT compiled code.
   1280             info->GetMethod()->SetEntryPointFromQuickCompiledCode(GetQuickToInterpreterBridge());
   1281           }
   1282         }
   1283 
   1284         DCHECK(CheckLiveCompiledCodeHasProfilingInfo());
   1285 
   1286         // Change entry points of native methods back to the GenericJNI entrypoint.
   1287         for (const auto& entry : jni_stubs_map_) {
   1288           const JniStubData& data = entry.second;
   1289           if (!data.IsCompiled()) {
   1290             continue;
   1291           }
   1292           // Make sure a single invocation of the GenericJNI trampoline tries to recompile.
   1293           uint16_t new_counter = Runtime::Current()->GetJit()->HotMethodThreshold() - 1u;
   1294           const OatQuickMethodHeader* method_header =
   1295               OatQuickMethodHeader::FromCodePointer(data.GetCode());
   1296           for (ArtMethod* method : data.GetMethods()) {
   1297             if (method->GetEntryPointFromQuickCompiledCode() == method_header->GetEntryPoint()) {
   1298               // Don't call Instrumentation::UpdateMethodsCode(), same as for normal methods above.
   1299               method->SetCounter(new_counter);
   1300               method->SetEntryPointFromQuickCompiledCode(GetQuickGenericJniStub());
   1301             }
   1302           }
   1303         }
   1304       }
   1305       live_bitmap_.reset(nullptr);
   1306       NotifyCollectionDone(self);
   1307     }
   1308   }
   1309   Runtime::Current()->GetJit()->AddTimingLogger(logger);
   1310 }
   1311 
   1312 void JitCodeCache::RemoveUnmarkedCode(Thread* self) {
   1313   ScopedTrace trace(__FUNCTION__);
   1314   std::unordered_set<OatQuickMethodHeader*> method_headers;
   1315   {
   1316     MutexLock mu(self, lock_);
   1317     ScopedCodeCacheWrite scc(this);
   1318     // Iterate over all compiled code and remove entries that are not marked.
   1319     for (auto it = jni_stubs_map_.begin(); it != jni_stubs_map_.end();) {
   1320       JniStubData* data = &it->second;
   1321       if (!data->IsCompiled() || GetLiveBitmap()->Test(FromCodeToAllocation(data->GetCode()))) {
   1322         ++it;
   1323       } else {
   1324         method_headers.insert(OatQuickMethodHeader::FromCodePointer(data->GetCode()));
   1325         it = jni_stubs_map_.erase(it);
   1326       }
   1327     }
   1328     for (auto it = method_code_map_.begin(); it != method_code_map_.end();) {
   1329       const void* code_ptr = it->first;
   1330       uintptr_t allocation = FromCodeToAllocation(code_ptr);
   1331       if (GetLiveBitmap()->Test(allocation)) {
   1332         ++it;
   1333       } else {
   1334         method_headers.insert(OatQuickMethodHeader::FromCodePointer(code_ptr));
   1335         it = method_code_map_.erase(it);
   1336       }
   1337     }
   1338   }
   1339   FreeAllMethodHeaders(method_headers);
   1340 }
   1341 
   1342 void JitCodeCache::DoCollection(Thread* self, bool collect_profiling_info) {
   1343   ScopedTrace trace(__FUNCTION__);
   1344   {
   1345     MutexLock mu(self, lock_);
   1346     if (collect_profiling_info) {
   1347       // Clear the profiling info of methods that do not have compiled code as entrypoint.
   1348       // Also remove the saved entry point from the ProfilingInfo objects.
   1349       for (ProfilingInfo* info : profiling_infos_) {
   1350         const void* ptr = info->GetMethod()->GetEntryPointFromQuickCompiledCode();
   1351         if (!ContainsPc(ptr) && !info->IsInUseByCompiler()) {
   1352           info->GetMethod()->SetProfilingInfo(nullptr);
   1353         }
   1354 
   1355         if (info->GetSavedEntryPoint() != nullptr) {
   1356           info->SetSavedEntryPoint(nullptr);
   1357           // We are going to move this method back to interpreter. Clear the counter now to
   1358           // give it a chance to be hot again.
   1359           ClearMethodCounter(info->GetMethod(), /*was_warm*/ true);
   1360         }
   1361       }
   1362     } else if (kIsDebugBuild) {
   1363       // Sanity check that the profiling infos do not have a dangling entry point.
   1364       for (ProfilingInfo* info : profiling_infos_) {
   1365         DCHECK(info->GetSavedEntryPoint() == nullptr);
   1366       }
   1367     }
   1368 
   1369     // Mark compiled code that are entrypoints of ArtMethods. Compiled code that is not
   1370     // an entry point is either:
   1371     // - an osr compiled code, that will be removed if not in a thread call stack.
   1372     // - discarded compiled code, that will be removed if not in a thread call stack.
   1373     for (const auto& entry : jni_stubs_map_) {
   1374       const JniStubData& data = entry.second;
   1375       const void* code_ptr = data.GetCode();
   1376       const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
   1377       for (ArtMethod* method : data.GetMethods()) {
   1378         if (method_header->GetEntryPoint() == method->GetEntryPointFromQuickCompiledCode()) {
   1379           GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
   1380           break;
   1381         }
   1382       }
   1383     }
   1384     for (const auto& it : method_code_map_) {
   1385       ArtMethod* method = it.second;
   1386       const void* code_ptr = it.first;
   1387       const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
   1388       if (method_header->GetEntryPoint() == method->GetEntryPointFromQuickCompiledCode()) {
   1389         GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
   1390       }
   1391     }
   1392 
   1393     // Empty osr method map, as osr compiled code will be deleted (except the ones
   1394     // on thread stacks).
   1395     osr_code_map_.clear();
   1396   }
   1397 
   1398   // Run a checkpoint on all threads to mark the JIT compiled code they are running.
   1399   MarkCompiledCodeOnThreadStacks(self);
   1400 
   1401   // At this point, mutator threads are still running, and entrypoints of methods can
   1402   // change. We do know they cannot change to a code cache entry that is not marked,
   1403   // therefore we can safely remove those entries.
   1404   RemoveUnmarkedCode(self);
   1405 
   1406   if (collect_profiling_info) {
   1407     MutexLock mu(self, lock_);
   1408     // Free all profiling infos of methods not compiled nor being compiled.
   1409     auto profiling_kept_end = std::remove_if(profiling_infos_.begin(), profiling_infos_.end(),
   1410       [this] (ProfilingInfo* info) NO_THREAD_SAFETY_ANALYSIS {
   1411         const void* ptr = info->GetMethod()->GetEntryPointFromQuickCompiledCode();
   1412         // We have previously cleared the ProfilingInfo pointer in the ArtMethod in the hope
   1413         // that the compiled code would not get revived. As mutator threads run concurrently,
   1414         // they may have revived the compiled code, and now we are in the situation where
   1415         // a method has compiled code but no ProfilingInfo.
   1416         // We make sure compiled methods have a ProfilingInfo object. It is needed for
   1417         // code cache collection.
   1418         if (ContainsPc(ptr) &&
   1419             info->GetMethod()->GetProfilingInfo(kRuntimePointerSize) == nullptr) {
   1420           info->GetMethod()->SetProfilingInfo(info);
   1421         } else if (info->GetMethod()->GetProfilingInfo(kRuntimePointerSize) != info) {
   1422           // No need for this ProfilingInfo object anymore.
   1423           FreeData(reinterpret_cast<uint8_t*>(info));
   1424           return true;
   1425         }
   1426         return false;
   1427       });
   1428     profiling_infos_.erase(profiling_kept_end, profiling_infos_.end());
   1429     DCHECK(CheckLiveCompiledCodeHasProfilingInfo());
   1430   }
   1431 }
   1432 
   1433 bool JitCodeCache::CheckLiveCompiledCodeHasProfilingInfo() {
   1434   ScopedTrace trace(__FUNCTION__);
   1435   // Check that methods we have compiled do have a ProfilingInfo object. We would
   1436   // have memory leaks of compiled code otherwise.
   1437   for (const auto& it : method_code_map_) {
   1438     ArtMethod* method = it.second;
   1439     if (method->GetProfilingInfo(kRuntimePointerSize) == nullptr) {
   1440       const void* code_ptr = it.first;
   1441       const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
   1442       if (method_header->GetEntryPoint() == method->GetEntryPointFromQuickCompiledCode()) {
   1443         // If the code is not dead, then we have a problem. Note that this can even
   1444         // happen just after a collection, as mutator threads are running in parallel
   1445         // and could deoptimize an existing compiled code.
   1446         return false;
   1447       }
   1448     }
   1449   }
   1450   return true;
   1451 }
   1452 
   1453 OatQuickMethodHeader* JitCodeCache::LookupMethodHeader(uintptr_t pc, ArtMethod* method) {
   1454   static_assert(kRuntimeISA != InstructionSet::kThumb2, "kThumb2 cannot be a runtime ISA");
   1455   if (kRuntimeISA == InstructionSet::kArm) {
   1456     // On Thumb-2, the pc is offset by one.
   1457     --pc;
   1458   }
   1459   if (!ContainsPc(reinterpret_cast<const void*>(pc))) {
   1460     return nullptr;
   1461   }
   1462 
   1463   if (!kIsDebugBuild) {
   1464     // Called with null `method` only from MarkCodeClosure::Run() in debug build.
   1465     CHECK(method != nullptr);
   1466   }
   1467 
   1468   MutexLock mu(Thread::Current(), lock_);
   1469   OatQuickMethodHeader* method_header = nullptr;
   1470   ArtMethod* found_method = nullptr;  // Only for DCHECK(), not for JNI stubs.
   1471   if (method != nullptr && UNLIKELY(method->IsNative())) {
   1472     auto it = jni_stubs_map_.find(JniStubKey(method));
   1473     if (it == jni_stubs_map_.end() || !ContainsElement(it->second.GetMethods(), method)) {
   1474       return nullptr;
   1475     }
   1476     const void* code_ptr = it->second.GetCode();
   1477     method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
   1478     if (!method_header->Contains(pc)) {
   1479       return nullptr;
   1480     }
   1481   } else {
   1482     auto it = method_code_map_.lower_bound(reinterpret_cast<const void*>(pc));
   1483     if (it != method_code_map_.begin()) {
   1484       --it;
   1485       const void* code_ptr = it->first;
   1486       if (OatQuickMethodHeader::FromCodePointer(code_ptr)->Contains(pc)) {
   1487         method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
   1488         found_method = it->second;
   1489       }
   1490     }
   1491     if (method_header == nullptr && method == nullptr) {
   1492       // Scan all compiled JNI stubs as well. This slow search is used only
   1493       // for checks in debug build, for release builds the `method` is not null.
   1494       for (auto&& entry : jni_stubs_map_) {
   1495         const JniStubData& data = entry.second;
   1496         if (data.IsCompiled() &&
   1497             OatQuickMethodHeader::FromCodePointer(data.GetCode())->Contains(pc)) {
   1498           method_header = OatQuickMethodHeader::FromCodePointer(data.GetCode());
   1499         }
   1500       }
   1501     }
   1502     if (method_header == nullptr) {
   1503       return nullptr;
   1504     }
   1505   }
   1506 
   1507   if (kIsDebugBuild && method != nullptr && !method->IsNative()) {
   1508     // When we are walking the stack to redefine classes and creating obsolete methods it is
   1509     // possible that we might have updated the method_code_map by making this method obsolete in a
   1510     // previous frame. Therefore we should just check that the non-obsolete version of this method
   1511     // is the one we expect. We change to the non-obsolete versions in the error message since the
   1512     // obsolete version of the method might not be fully initialized yet. This situation can only
   1513     // occur when we are in the process of allocating and setting up obsolete methods. Otherwise
   1514     // method and it->second should be identical. (See openjdkjvmti/ti_redefine.cc for more
   1515     // information.)
   1516     DCHECK_EQ(found_method->GetNonObsoleteMethod(), method->GetNonObsoleteMethod())
   1517         << ArtMethod::PrettyMethod(method->GetNonObsoleteMethod()) << " "
   1518         << ArtMethod::PrettyMethod(found_method->GetNonObsoleteMethod()) << " "
   1519         << std::hex << pc;
   1520   }
   1521   return method_header;
   1522 }
   1523 
   1524 OatQuickMethodHeader* JitCodeCache::LookupOsrMethodHeader(ArtMethod* method) {
   1525   MutexLock mu(Thread::Current(), lock_);
   1526   auto it = osr_code_map_.find(method);
   1527   if (it == osr_code_map_.end()) {
   1528     return nullptr;
   1529   }
   1530   return OatQuickMethodHeader::FromCodePointer(it->second);
   1531 }
   1532 
   1533 ProfilingInfo* JitCodeCache::AddProfilingInfo(Thread* self,
   1534                                               ArtMethod* method,
   1535                                               const std::vector<uint32_t>& entries,
   1536                                               bool retry_allocation)
   1537     // No thread safety analysis as we are using TryLock/Unlock explicitly.
   1538     NO_THREAD_SAFETY_ANALYSIS {
   1539   ProfilingInfo* info = nullptr;
   1540   if (!retry_allocation) {
   1541     // If we are allocating for the interpreter, just try to lock, to avoid
   1542     // lock contention with the JIT.
   1543     if (lock_.ExclusiveTryLock(self)) {
   1544       info = AddProfilingInfoInternal(self, method, entries);
   1545       lock_.ExclusiveUnlock(self);
   1546     }
   1547   } else {
   1548     {
   1549       MutexLock mu(self, lock_);
   1550       info = AddProfilingInfoInternal(self, method, entries);
   1551     }
   1552 
   1553     if (info == nullptr) {
   1554       GarbageCollectCache(self);
   1555       MutexLock mu(self, lock_);
   1556       info = AddProfilingInfoInternal(self, method, entries);
   1557     }
   1558   }
   1559   return info;
   1560 }
   1561 
   1562 ProfilingInfo* JitCodeCache::AddProfilingInfoInternal(Thread* self ATTRIBUTE_UNUSED,
   1563                                                       ArtMethod* method,
   1564                                                       const std::vector<uint32_t>& entries) {
   1565   size_t profile_info_size = RoundUp(
   1566       sizeof(ProfilingInfo) + sizeof(InlineCache) * entries.size(),
   1567       sizeof(void*));
   1568 
   1569   // Check whether some other thread has concurrently created it.
   1570   ProfilingInfo* info = method->GetProfilingInfo(kRuntimePointerSize);
   1571   if (info != nullptr) {
   1572     return info;
   1573   }
   1574 
   1575   uint8_t* data = AllocateData(profile_info_size);
   1576   if (data == nullptr) {
   1577     return nullptr;
   1578   }
   1579   info = new (data) ProfilingInfo(method, entries);
   1580 
   1581   // Make sure other threads see the data in the profiling info object before the
   1582   // store in the ArtMethod's ProfilingInfo pointer.
   1583   QuasiAtomic::ThreadFenceRelease();
   1584 
   1585   method->SetProfilingInfo(info);
   1586   profiling_infos_.push_back(info);
   1587   histogram_profiling_info_memory_use_.AddValue(profile_info_size);
   1588   return info;
   1589 }
   1590 
   1591 // NO_THREAD_SAFETY_ANALYSIS as this is called from mspace code, at which point the lock
   1592 // is already held.
   1593 void* JitCodeCache::MoreCore(const void* mspace, intptr_t increment) NO_THREAD_SAFETY_ANALYSIS {
   1594   if (code_mspace_ == mspace) {
   1595     size_t result = code_end_;
   1596     code_end_ += increment;
   1597     return reinterpret_cast<void*>(result + code_map_->Begin());
   1598   } else {
   1599     DCHECK_EQ(data_mspace_, mspace);
   1600     size_t result = data_end_;
   1601     data_end_ += increment;
   1602     return reinterpret_cast<void*>(result + data_map_->Begin());
   1603   }
   1604 }
   1605 
   1606 void JitCodeCache::GetProfiledMethods(const std::set<std::string>& dex_base_locations,
   1607                                       std::vector<ProfileMethodInfo>& methods) {
   1608   ScopedTrace trace(__FUNCTION__);
   1609   MutexLock mu(Thread::Current(), lock_);
   1610   uint16_t jit_compile_threshold = Runtime::Current()->GetJITOptions()->GetCompileThreshold();
   1611   for (const ProfilingInfo* info : profiling_infos_) {
   1612     ArtMethod* method = info->GetMethod();
   1613     const DexFile* dex_file = method->GetDexFile();
   1614     const std::string base_location = DexFileLoader::GetBaseLocation(dex_file->GetLocation());
   1615     if (!ContainsElement(dex_base_locations, base_location)) {
   1616       // Skip dex files which are not profiled.
   1617       continue;
   1618     }
   1619     std::vector<ProfileMethodInfo::ProfileInlineCache> inline_caches;
   1620 
   1621     // If the method didn't reach the compilation threshold don't save the inline caches.
   1622     // They might be incomplete and cause unnecessary deoptimizations.
   1623     // If the inline cache is empty the compiler will generate a regular invoke virtual/interface.
   1624     if (method->GetCounter() < jit_compile_threshold) {
   1625       methods.emplace_back(/*ProfileMethodInfo*/
   1626           MethodReference(dex_file, method->GetDexMethodIndex()), inline_caches);
   1627       continue;
   1628     }
   1629 
   1630     for (size_t i = 0; i < info->number_of_inline_caches_; ++i) {
   1631       std::vector<TypeReference> profile_classes;
   1632       const InlineCache& cache = info->cache_[i];
   1633       ArtMethod* caller = info->GetMethod();
   1634       bool is_missing_types = false;
   1635       for (size_t k = 0; k < InlineCache::kIndividualCacheSize; k++) {
   1636         mirror::Class* cls = cache.classes_[k].Read();
   1637         if (cls == nullptr) {
   1638           break;
   1639         }
   1640 
   1641         // Check if the receiver is in the boot class path or if it's in the
   1642         // same class loader as the caller. If not, skip it, as there is not
   1643         // much we can do during AOT.
   1644         if (!cls->IsBootStrapClassLoaded() &&
   1645             caller->GetClassLoader() != cls->GetClassLoader()) {
   1646           is_missing_types = true;
   1647           continue;
   1648         }
   1649 
   1650         const DexFile* class_dex_file = nullptr;
   1651         dex::TypeIndex type_index;
   1652 
   1653         if (cls->GetDexCache() == nullptr) {
   1654           DCHECK(cls->IsArrayClass()) << cls->PrettyClass();
   1655           // Make a best effort to find the type index in the method's dex file.
   1656           // We could search all open dex files but that might turn expensive
   1657           // and probably not worth it.
   1658           class_dex_file = dex_file;
   1659           type_index = cls->FindTypeIndexInOtherDexFile(*dex_file);
   1660         } else {
   1661           class_dex_file = &(cls->GetDexFile());
   1662           type_index = cls->GetDexTypeIndex();
   1663         }
   1664         if (!type_index.IsValid()) {
   1665           // Could be a proxy class or an array for which we couldn't find the type index.
   1666           is_missing_types = true;
   1667           continue;
   1668         }
   1669         if (ContainsElement(dex_base_locations,
   1670                             DexFileLoader::GetBaseLocation(class_dex_file->GetLocation()))) {
   1671           // Only consider classes from the same apk (including multidex).
   1672           profile_classes.emplace_back(/*ProfileMethodInfo::ProfileClassReference*/
   1673               class_dex_file, type_index);
   1674         } else {
   1675           is_missing_types = true;
   1676         }
   1677       }
   1678       if (!profile_classes.empty()) {
   1679         inline_caches.emplace_back(/*ProfileMethodInfo::ProfileInlineCache*/
   1680             cache.dex_pc_, is_missing_types, profile_classes);
   1681       }
   1682     }
   1683     methods.emplace_back(/*ProfileMethodInfo*/
   1684         MethodReference(dex_file, method->GetDexMethodIndex()), inline_caches);
   1685   }
   1686 }
   1687 
   1688 uint64_t JitCodeCache::GetLastUpdateTimeNs() const {
   1689   return last_update_time_ns_.LoadAcquire();
   1690 }
   1691 
   1692 bool JitCodeCache::IsOsrCompiled(ArtMethod* method) {
   1693   MutexLock mu(Thread::Current(), lock_);
   1694   return osr_code_map_.find(method) != osr_code_map_.end();
   1695 }
   1696 
   1697 bool JitCodeCache::NotifyCompilationOf(ArtMethod* method, Thread* self, bool osr) {
   1698   if (!osr && ContainsPc(method->GetEntryPointFromQuickCompiledCode())) {
   1699     return false;
   1700   }
   1701 
   1702   MutexLock mu(self, lock_);
   1703   if (osr && (osr_code_map_.find(method) != osr_code_map_.end())) {
   1704     return false;
   1705   }
   1706 
   1707   if (UNLIKELY(method->IsNative())) {
   1708     JniStubKey key(method);
   1709     auto it = jni_stubs_map_.find(key);
   1710     bool new_compilation = false;
   1711     if (it == jni_stubs_map_.end()) {
   1712       // Create a new entry to mark the stub as being compiled.
   1713       it = jni_stubs_map_.Put(key, JniStubData{});
   1714       new_compilation = true;
   1715     }
   1716     JniStubData* data = &it->second;
   1717     data->AddMethod(method);
   1718     if (data->IsCompiled()) {
   1719       OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(data->GetCode());
   1720       const void* entrypoint = method_header->GetEntryPoint();
   1721       // Update also entrypoints of other methods held by the JniStubData.
   1722       // We could simply update the entrypoint of `method` but if the last JIT GC has
   1723       // changed these entrypoints to GenericJNI in preparation for a full GC, we may
   1724       // as well change them back as this stub shall not be collected anyway and this
   1725       // can avoid a few expensive GenericJNI calls.
   1726       instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation();
   1727       for (ArtMethod* m : data->GetMethods()) {
   1728         // Call the dedicated method instead of the more generic UpdateMethodsCode, because
   1729         // `m` might be in the process of being deleted.
   1730         instrumentation->UpdateNativeMethodsCodeToJitCode(m, entrypoint);
   1731       }
   1732       if (collection_in_progress_) {
   1733         GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(data->GetCode()));
   1734       }
   1735     }
   1736     return new_compilation;
   1737   } else {
   1738     ProfilingInfo* info = method->GetProfilingInfo(kRuntimePointerSize);
   1739     if (info == nullptr) {
   1740       VLOG(jit) << method->PrettyMethod() << " needs a ProfilingInfo to be compiled";
   1741       // Because the counter is not atomic, there are some rare cases where we may not hit the
   1742       // threshold for creating the ProfilingInfo. Reset the counter now to "correct" this.
   1743       ClearMethodCounter(method, /*was_warm*/ false);
   1744       return false;
   1745     }
   1746 
   1747     if (info->IsMethodBeingCompiled(osr)) {
   1748       return false;
   1749     }
   1750 
   1751     info->SetIsMethodBeingCompiled(true, osr);
   1752     return true;
   1753   }
   1754 }
   1755 
   1756 ProfilingInfo* JitCodeCache::NotifyCompilerUse(ArtMethod* method, Thread* self) {
   1757   MutexLock mu(self, lock_);
   1758   ProfilingInfo* info = method->GetProfilingInfo(kRuntimePointerSize);
   1759   if (info != nullptr) {
   1760     if (!info->IncrementInlineUse()) {
   1761       // Overflow of inlining uses, just bail.
   1762       return nullptr;
   1763     }
   1764   }
   1765   return info;
   1766 }
   1767 
   1768 void JitCodeCache::DoneCompilerUse(ArtMethod* method, Thread* self) {
   1769   MutexLock mu(self, lock_);
   1770   ProfilingInfo* info = method->GetProfilingInfo(kRuntimePointerSize);
   1771   DCHECK(info != nullptr);
   1772   info->DecrementInlineUse();
   1773 }
   1774 
   1775 void JitCodeCache::DoneCompiling(ArtMethod* method, Thread* self, bool osr) {
   1776   DCHECK_EQ(Thread::Current(), self);
   1777   MutexLock mu(self, lock_);
   1778   if (UNLIKELY(method->IsNative())) {
   1779     auto it = jni_stubs_map_.find(JniStubKey(method));
   1780     DCHECK(it != jni_stubs_map_.end());
   1781     JniStubData* data = &it->second;
   1782     DCHECK(ContainsElement(data->GetMethods(), method));
   1783     if (UNLIKELY(!data->IsCompiled())) {
   1784       // Failed to compile; the JNI compiler never fails, but the cache may be full.
   1785       jni_stubs_map_.erase(it);  // Remove the entry added in NotifyCompilationOf().
   1786     }  // else CommitCodeInternal() updated entrypoints of all methods in the JniStubData.
   1787   } else {
   1788     ProfilingInfo* info = method->GetProfilingInfo(kRuntimePointerSize);
   1789     DCHECK(info->IsMethodBeingCompiled(osr));
   1790     info->SetIsMethodBeingCompiled(false, osr);
   1791   }
   1792 }
   1793 
   1794 size_t JitCodeCache::GetMemorySizeOfCodePointer(const void* ptr) {
   1795   MutexLock mu(Thread::Current(), lock_);
   1796   return mspace_usable_size(reinterpret_cast<const void*>(FromCodeToAllocation(ptr)));
   1797 }
   1798 
   1799 void JitCodeCache::InvalidateCompiledCodeFor(ArtMethod* method,
   1800                                              const OatQuickMethodHeader* header) {
   1801   DCHECK(!method->IsNative());
   1802   ProfilingInfo* profiling_info = method->GetProfilingInfo(kRuntimePointerSize);
   1803   if ((profiling_info != nullptr) &&
   1804       (profiling_info->GetSavedEntryPoint() == header->GetEntryPoint())) {
   1805     // Prevent future uses of the compiled code.
   1806     profiling_info->SetSavedEntryPoint(nullptr);
   1807   }
   1808 
   1809   if (method->GetEntryPointFromQuickCompiledCode() == header->GetEntryPoint()) {
   1810     // The entrypoint is the one to invalidate, so we just update it to the interpreter entry point
   1811     // and clear the counter to get the method Jitted again.
   1812     Runtime::Current()->GetInstrumentation()->UpdateMethodsCode(
   1813         method, GetQuickToInterpreterBridge());
   1814     ClearMethodCounter(method, /*was_warm*/ profiling_info != nullptr);
   1815   } else {
   1816     MutexLock mu(Thread::Current(), lock_);
   1817     auto it = osr_code_map_.find(method);
   1818     if (it != osr_code_map_.end() && OatQuickMethodHeader::FromCodePointer(it->second) == header) {
   1819       // Remove the OSR method, to avoid using it again.
   1820       osr_code_map_.erase(it);
   1821     }
   1822   }
   1823 }
   1824 
   1825 uint8_t* JitCodeCache::AllocateCode(size_t code_size) {
   1826   size_t alignment = GetInstructionSetAlignment(kRuntimeISA);
   1827   uint8_t* result = reinterpret_cast<uint8_t*>(
   1828       mspace_memalign(code_mspace_, alignment, code_size));
   1829   size_t header_size = RoundUp(sizeof(OatQuickMethodHeader), alignment);
   1830   // Ensure the header ends up at expected instruction alignment.
   1831   DCHECK_ALIGNED_PARAM(reinterpret_cast<uintptr_t>(result + header_size), alignment);
   1832   used_memory_for_code_ += mspace_usable_size(result);
   1833   return result;
   1834 }
   1835 
   1836 void JitCodeCache::FreeCode(uint8_t* code) {
   1837   used_memory_for_code_ -= mspace_usable_size(code);
   1838   mspace_free(code_mspace_, code);
   1839 }
   1840 
   1841 uint8_t* JitCodeCache::AllocateData(size_t data_size) {
   1842   void* result = mspace_malloc(data_mspace_, data_size);
   1843   used_memory_for_data_ += mspace_usable_size(result);
   1844   return reinterpret_cast<uint8_t*>(result);
   1845 }
   1846 
   1847 void JitCodeCache::FreeData(uint8_t* data) {
   1848   used_memory_for_data_ -= mspace_usable_size(data);
   1849   mspace_free(data_mspace_, data);
   1850 }
   1851 
   1852 void JitCodeCache::Dump(std::ostream& os) {
   1853   MutexLock mu(Thread::Current(), lock_);
   1854   MutexLock mu2(Thread::Current(), *Locks::native_debug_interface_lock_);
   1855   os << "Current JIT code cache size: " << PrettySize(used_memory_for_code_) << "\n"
   1856      << "Current JIT data cache size: " << PrettySize(used_memory_for_data_) << "\n"
   1857      << "Current JIT mini-debug-info size: " << PrettySize(GetJitNativeDebugInfoMemUsage()) << "\n"
   1858      << "Current JIT capacity: " << PrettySize(current_capacity_) << "\n"
   1859      << "Current number of JIT JNI stub entries: " << jni_stubs_map_.size() << "\n"
   1860      << "Current number of JIT code cache entries: " << method_code_map_.size() << "\n"
   1861      << "Total number of JIT compilations: " << number_of_compilations_ << "\n"
   1862      << "Total number of JIT compilations for on stack replacement: "
   1863         << number_of_osr_compilations_ << "\n"
   1864      << "Total number of JIT code cache collections: " << number_of_collections_ << std::endl;
   1865   histogram_stack_map_memory_use_.PrintMemoryUse(os);
   1866   histogram_code_memory_use_.PrintMemoryUse(os);
   1867   histogram_profiling_info_memory_use_.PrintMemoryUse(os);
   1868 }
   1869 
   1870 }  // namespace jit
   1871 }  // namespace art
   1872