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