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 "art_method-inl.h"
     22 #include "base/stl_util.h"
     23 #include "base/systrace.h"
     24 #include "base/time_utils.h"
     25 #include "debugger_interface.h"
     26 #include "entrypoints/runtime_asm_entrypoints.h"
     27 #include "gc/accounting/bitmap-inl.h"
     28 #include "gc/scoped_gc_critical_section.h"
     29 #include "jit/jit.h"
     30 #include "jit/profiling_info.h"
     31 #include "linear_alloc.h"
     32 #include "mem_map.h"
     33 #include "oat_file-inl.h"
     34 #include "scoped_thread_state_change.h"
     35 #include "thread_list.h"
     36 
     37 namespace art {
     38 namespace jit {
     39 
     40 static constexpr int kProtAll = PROT_READ | PROT_WRITE | PROT_EXEC;
     41 static constexpr int kProtData = PROT_READ | PROT_WRITE;
     42 static constexpr int kProtCode = PROT_READ | PROT_EXEC;
     43 
     44 static constexpr size_t kCodeSizeLogThreshold = 50 * KB;
     45 static constexpr size_t kStackMapSizeLogThreshold = 50 * KB;
     46 
     47 #define CHECKED_MPROTECT(memory, size, prot)                \
     48   do {                                                      \
     49     int rc = mprotect(memory, size, prot);                  \
     50     if (UNLIKELY(rc != 0)) {                                \
     51       errno = rc;                                           \
     52       PLOG(FATAL) << "Failed to mprotect jit code cache";   \
     53     }                                                       \
     54   } while (false)                                           \
     55 
     56 JitCodeCache* JitCodeCache::Create(size_t initial_capacity,
     57                                    size_t max_capacity,
     58                                    bool generate_debug_info,
     59                                    std::string* error_msg) {
     60   ScopedTrace trace(__PRETTY_FUNCTION__);
     61   CHECK_GE(max_capacity, initial_capacity);
     62 
     63   // Generating debug information is mostly for using the 'perf' tool, which does
     64   // not work with ashmem.
     65   bool use_ashmem = !generate_debug_info;
     66   // With 'perf', we want a 1-1 mapping between an address and a method.
     67   bool garbage_collect_code = !generate_debug_info;
     68 
     69   // We need to have 32 bit offsets from method headers in code cache which point to things
     70   // in the data cache. If the maps are more than 4G apart, having multiple maps wouldn't work.
     71   // Ensure we're below 1 GB to be safe.
     72   if (max_capacity > 1 * GB) {
     73     std::ostringstream oss;
     74     oss << "Maxium code cache capacity is limited to 1 GB, "
     75         << PrettySize(max_capacity) << " is too big";
     76     *error_msg = oss.str();
     77     return nullptr;
     78   }
     79 
     80   std::string error_str;
     81   // Map name specific for android_os_Debug.cpp accounting.
     82   MemMap* data_map = MemMap::MapAnonymous(
     83       "data-code-cache", nullptr, max_capacity, kProtAll, false, false, &error_str, use_ashmem);
     84   if (data_map == nullptr) {
     85     std::ostringstream oss;
     86     oss << "Failed to create read write execute cache: " << error_str << " size=" << max_capacity;
     87     *error_msg = oss.str();
     88     return nullptr;
     89   }
     90 
     91   // Align both capacities to page size, as that's the unit mspaces use.
     92   initial_capacity = RoundDown(initial_capacity, 2 * kPageSize);
     93   max_capacity = RoundDown(max_capacity, 2 * kPageSize);
     94 
     95   // Data cache is 1 / 2 of the map.
     96   // TODO: Make this variable?
     97   size_t data_size = max_capacity / 2;
     98   size_t code_size = max_capacity - data_size;
     99   DCHECK_EQ(code_size + data_size, max_capacity);
    100   uint8_t* divider = data_map->Begin() + data_size;
    101 
    102   MemMap* code_map =
    103       data_map->RemapAtEnd(divider, "jit-code-cache", kProtAll, &error_str, use_ashmem);
    104   if (code_map == nullptr) {
    105     std::ostringstream oss;
    106     oss << "Failed to create read write execute cache: " << error_str << " size=" << max_capacity;
    107     *error_msg = oss.str();
    108     return nullptr;
    109   }
    110   DCHECK_EQ(code_map->Begin(), divider);
    111   data_size = initial_capacity / 2;
    112   code_size = initial_capacity - data_size;
    113   DCHECK_EQ(code_size + data_size, initial_capacity);
    114   return new JitCodeCache(
    115       code_map, data_map, code_size, data_size, max_capacity, garbage_collect_code);
    116 }
    117 
    118 JitCodeCache::JitCodeCache(MemMap* code_map,
    119                            MemMap* data_map,
    120                            size_t initial_code_capacity,
    121                            size_t initial_data_capacity,
    122                            size_t max_capacity,
    123                            bool garbage_collect_code)
    124     : lock_("Jit code cache", kJitCodeCacheLock),
    125       lock_cond_("Jit code cache variable", lock_),
    126       collection_in_progress_(false),
    127       code_map_(code_map),
    128       data_map_(data_map),
    129       max_capacity_(max_capacity),
    130       current_capacity_(initial_code_capacity + initial_data_capacity),
    131       code_end_(initial_code_capacity),
    132       data_end_(initial_data_capacity),
    133       last_collection_increased_code_cache_(false),
    134       last_update_time_ns_(0),
    135       garbage_collect_code_(garbage_collect_code),
    136       used_memory_for_data_(0),
    137       used_memory_for_code_(0),
    138       number_of_compilations_(0),
    139       number_of_osr_compilations_(0),
    140       number_of_deoptimizations_(0),
    141       number_of_collections_(0),
    142       histogram_stack_map_memory_use_("Memory used for stack maps", 16),
    143       histogram_code_memory_use_("Memory used for compiled code", 16),
    144       histogram_profiling_info_memory_use_("Memory used for profiling info", 16) {
    145 
    146   DCHECK_GE(max_capacity, initial_code_capacity + initial_data_capacity);
    147   code_mspace_ = create_mspace_with_base(code_map_->Begin(), code_end_, false /*locked*/);
    148   data_mspace_ = create_mspace_with_base(data_map_->Begin(), data_end_, false /*locked*/);
    149 
    150   if (code_mspace_ == nullptr || data_mspace_ == nullptr) {
    151     PLOG(FATAL) << "create_mspace_with_base failed";
    152   }
    153 
    154   SetFootprintLimit(current_capacity_);
    155 
    156   CHECKED_MPROTECT(code_map_->Begin(), code_map_->Size(), kProtCode);
    157   CHECKED_MPROTECT(data_map_->Begin(), data_map_->Size(), kProtData);
    158 
    159   VLOG(jit) << "Created jit code cache: initial data size="
    160             << PrettySize(initial_data_capacity)
    161             << ", initial code size="
    162             << PrettySize(initial_code_capacity);
    163 }
    164 
    165 bool JitCodeCache::ContainsPc(const void* ptr) const {
    166   return code_map_->Begin() <= ptr && ptr < code_map_->End();
    167 }
    168 
    169 bool JitCodeCache::ContainsMethod(ArtMethod* method) {
    170   MutexLock mu(Thread::Current(), lock_);
    171   for (auto& it : method_code_map_) {
    172     if (it.second == method) {
    173       return true;
    174     }
    175   }
    176   return false;
    177 }
    178 
    179 class ScopedCodeCacheWrite : ScopedTrace {
    180  public:
    181   explicit ScopedCodeCacheWrite(MemMap* code_map)
    182       : ScopedTrace("ScopedCodeCacheWrite"),
    183         code_map_(code_map) {
    184     ScopedTrace trace("mprotect all");
    185     CHECKED_MPROTECT(code_map_->Begin(), code_map_->Size(), kProtAll);
    186   }
    187   ~ScopedCodeCacheWrite() {
    188     ScopedTrace trace("mprotect code");
    189     CHECKED_MPROTECT(code_map_->Begin(), code_map_->Size(), kProtCode);
    190   }
    191  private:
    192   MemMap* const code_map_;
    193 
    194   DISALLOW_COPY_AND_ASSIGN(ScopedCodeCacheWrite);
    195 };
    196 
    197 uint8_t* JitCodeCache::CommitCode(Thread* self,
    198                                   ArtMethod* method,
    199                                   const uint8_t* vmap_table,
    200                                   size_t frame_size_in_bytes,
    201                                   size_t core_spill_mask,
    202                                   size_t fp_spill_mask,
    203                                   const uint8_t* code,
    204                                   size_t code_size,
    205                                   bool osr) {
    206   uint8_t* result = CommitCodeInternal(self,
    207                                        method,
    208                                        vmap_table,
    209                                        frame_size_in_bytes,
    210                                        core_spill_mask,
    211                                        fp_spill_mask,
    212                                        code,
    213                                        code_size,
    214                                        osr);
    215   if (result == nullptr) {
    216     // Retry.
    217     GarbageCollectCache(self);
    218     result = CommitCodeInternal(self,
    219                                 method,
    220                                 vmap_table,
    221                                 frame_size_in_bytes,
    222                                 core_spill_mask,
    223                                 fp_spill_mask,
    224                                 code,
    225                                 code_size,
    226                                 osr);
    227   }
    228   return result;
    229 }
    230 
    231 bool JitCodeCache::WaitForPotentialCollectionToComplete(Thread* self) {
    232   bool in_collection = false;
    233   while (collection_in_progress_) {
    234     in_collection = true;
    235     lock_cond_.Wait(self);
    236   }
    237   return in_collection;
    238 }
    239 
    240 static uintptr_t FromCodeToAllocation(const void* code) {
    241   size_t alignment = GetInstructionSetAlignment(kRuntimeISA);
    242   return reinterpret_cast<uintptr_t>(code) - RoundUp(sizeof(OatQuickMethodHeader), alignment);
    243 }
    244 
    245 void JitCodeCache::FreeCode(const void* code_ptr, ArtMethod* method ATTRIBUTE_UNUSED) {
    246   uintptr_t allocation = FromCodeToAllocation(code_ptr);
    247   const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
    248   // Notify native debugger that we are about to remove the code.
    249   // It does nothing if we are not using native debugger.
    250   DeleteJITCodeEntryForAddress(reinterpret_cast<uintptr_t>(code_ptr));
    251 
    252   // Use the offset directly to prevent sanity check that the method is
    253   // compiled with optimizing.
    254   // TODO(ngeoffray): Clean up.
    255   if (method_header->vmap_table_offset_ != 0) {
    256     const uint8_t* data = method_header->code_ - method_header->vmap_table_offset_;
    257     FreeData(const_cast<uint8_t*>(data));
    258   }
    259   FreeCode(reinterpret_cast<uint8_t*>(allocation));
    260 }
    261 
    262 void JitCodeCache::RemoveMethodsIn(Thread* self, const LinearAlloc& alloc) {
    263   ScopedTrace trace(__PRETTY_FUNCTION__);
    264   MutexLock mu(self, lock_);
    265   // We do not check if a code cache GC is in progress, as this method comes
    266   // with the classlinker_classes_lock_ held, and suspending ourselves could
    267   // lead to a deadlock.
    268   {
    269     ScopedCodeCacheWrite scc(code_map_.get());
    270     for (auto it = method_code_map_.begin(); it != method_code_map_.end();) {
    271       if (alloc.ContainsUnsafe(it->second)) {
    272         FreeCode(it->first, it->second);
    273         it = method_code_map_.erase(it);
    274       } else {
    275         ++it;
    276       }
    277     }
    278   }
    279   for (auto it = osr_code_map_.begin(); it != osr_code_map_.end();) {
    280     if (alloc.ContainsUnsafe(it->first)) {
    281       // Note that the code has already been removed in the loop above.
    282       it = osr_code_map_.erase(it);
    283     } else {
    284       ++it;
    285     }
    286   }
    287   for (auto it = profiling_infos_.begin(); it != profiling_infos_.end();) {
    288     ProfilingInfo* info = *it;
    289     if (alloc.ContainsUnsafe(info->GetMethod())) {
    290       info->GetMethod()->SetProfilingInfo(nullptr);
    291       FreeData(reinterpret_cast<uint8_t*>(info));
    292       it = profiling_infos_.erase(it);
    293     } else {
    294       ++it;
    295     }
    296   }
    297 }
    298 
    299 void JitCodeCache::ClearGcRootsInInlineCaches(Thread* self) {
    300   MutexLock mu(self, lock_);
    301   for (ProfilingInfo* info : profiling_infos_) {
    302     if (!info->IsInUseByCompiler()) {
    303       info->ClearGcRootsInInlineCaches();
    304     }
    305   }
    306 }
    307 
    308 uint8_t* JitCodeCache::CommitCodeInternal(Thread* self,
    309                                           ArtMethod* method,
    310                                           const uint8_t* vmap_table,
    311                                           size_t frame_size_in_bytes,
    312                                           size_t core_spill_mask,
    313                                           size_t fp_spill_mask,
    314                                           const uint8_t* code,
    315                                           size_t code_size,
    316                                           bool osr) {
    317   size_t alignment = GetInstructionSetAlignment(kRuntimeISA);
    318   // Ensure the header ends up at expected instruction alignment.
    319   size_t header_size = RoundUp(sizeof(OatQuickMethodHeader), alignment);
    320   size_t total_size = header_size + code_size;
    321 
    322   OatQuickMethodHeader* method_header = nullptr;
    323   uint8_t* code_ptr = nullptr;
    324   uint8_t* memory = nullptr;
    325   {
    326     ScopedThreadSuspension sts(self, kSuspended);
    327     MutexLock mu(self, lock_);
    328     WaitForPotentialCollectionToComplete(self);
    329     {
    330       ScopedCodeCacheWrite scc(code_map_.get());
    331       memory = AllocateCode(total_size);
    332       if (memory == nullptr) {
    333         return nullptr;
    334       }
    335       code_ptr = memory + header_size;
    336 
    337       std::copy(code, code + code_size, code_ptr);
    338       method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
    339       new (method_header) OatQuickMethodHeader(
    340           (vmap_table == nullptr) ? 0 : code_ptr - vmap_table,
    341           frame_size_in_bytes,
    342           core_spill_mask,
    343           fp_spill_mask,
    344           code_size);
    345     }
    346 
    347     FlushInstructionCache(reinterpret_cast<char*>(code_ptr),
    348                           reinterpret_cast<char*>(code_ptr + code_size));
    349     number_of_compilations_++;
    350   }
    351   // We need to update the entry point in the runnable state for the instrumentation.
    352   {
    353     MutexLock mu(self, lock_);
    354     method_code_map_.Put(code_ptr, method);
    355     if (osr) {
    356       number_of_osr_compilations_++;
    357       osr_code_map_.Put(method, code_ptr);
    358     } else {
    359       Runtime::Current()->GetInstrumentation()->UpdateMethodsCode(
    360           method, method_header->GetEntryPoint());
    361     }
    362     if (collection_in_progress_) {
    363       // We need to update the live bitmap if there is a GC to ensure it sees this new
    364       // code.
    365       GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
    366     }
    367     last_update_time_ns_.StoreRelease(NanoTime());
    368     VLOG(jit)
    369         << "JIT added (osr=" << std::boolalpha << osr << std::noboolalpha << ") "
    370         << PrettyMethod(method) << "@" << method
    371         << " ccache_size=" << PrettySize(CodeCacheSizeLocked()) << ": "
    372         << " dcache_size=" << PrettySize(DataCacheSizeLocked()) << ": "
    373         << reinterpret_cast<const void*>(method_header->GetEntryPoint()) << ","
    374         << reinterpret_cast<const void*>(method_header->GetEntryPoint() + method_header->code_size_);
    375     histogram_code_memory_use_.AddValue(code_size);
    376     if (code_size > kCodeSizeLogThreshold) {
    377       LOG(INFO) << "JIT allocated "
    378                 << PrettySize(code_size)
    379                 << " for compiled code of "
    380                 << PrettyMethod(method);
    381     }
    382   }
    383 
    384   return reinterpret_cast<uint8_t*>(method_header);
    385 }
    386 
    387 size_t JitCodeCache::CodeCacheSize() {
    388   MutexLock mu(Thread::Current(), lock_);
    389   return CodeCacheSizeLocked();
    390 }
    391 
    392 size_t JitCodeCache::CodeCacheSizeLocked() {
    393   return used_memory_for_code_;
    394 }
    395 
    396 size_t JitCodeCache::DataCacheSize() {
    397   MutexLock mu(Thread::Current(), lock_);
    398   return DataCacheSizeLocked();
    399 }
    400 
    401 size_t JitCodeCache::DataCacheSizeLocked() {
    402   return used_memory_for_data_;
    403 }
    404 
    405 void JitCodeCache::ClearData(Thread* self, void* data) {
    406   MutexLock mu(self, lock_);
    407   FreeData(reinterpret_cast<uint8_t*>(data));
    408 }
    409 
    410 uint8_t* JitCodeCache::ReserveData(Thread* self, size_t size, ArtMethod* method) {
    411   size = RoundUp(size, sizeof(void*));
    412   uint8_t* result = nullptr;
    413 
    414   {
    415     ScopedThreadSuspension sts(self, kSuspended);
    416     MutexLock mu(self, lock_);
    417     WaitForPotentialCollectionToComplete(self);
    418     result = AllocateData(size);
    419   }
    420 
    421   if (result == nullptr) {
    422     // Retry.
    423     GarbageCollectCache(self);
    424     ScopedThreadSuspension sts(self, kSuspended);
    425     MutexLock mu(self, lock_);
    426     WaitForPotentialCollectionToComplete(self);
    427     result = AllocateData(size);
    428   }
    429 
    430   MutexLock mu(self, lock_);
    431   histogram_stack_map_memory_use_.AddValue(size);
    432   if (size > kStackMapSizeLogThreshold) {
    433     LOG(INFO) << "JIT allocated "
    434               << PrettySize(size)
    435               << " for stack maps of "
    436               << PrettyMethod(method);
    437   }
    438   return result;
    439 }
    440 
    441 class MarkCodeVisitor FINAL : public StackVisitor {
    442  public:
    443   MarkCodeVisitor(Thread* thread_in, JitCodeCache* code_cache_in)
    444       : StackVisitor(thread_in, nullptr, StackVisitor::StackWalkKind::kSkipInlinedFrames),
    445         code_cache_(code_cache_in),
    446         bitmap_(code_cache_->GetLiveBitmap()) {}
    447 
    448   bool VisitFrame() OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) {
    449     const OatQuickMethodHeader* method_header = GetCurrentOatQuickMethodHeader();
    450     if (method_header == nullptr) {
    451       return true;
    452     }
    453     const void* code = method_header->GetCode();
    454     if (code_cache_->ContainsPc(code)) {
    455       // Use the atomic set version, as multiple threads are executing this code.
    456       bitmap_->AtomicTestAndSet(FromCodeToAllocation(code));
    457     }
    458     return true;
    459   }
    460 
    461  private:
    462   JitCodeCache* const code_cache_;
    463   CodeCacheBitmap* const bitmap_;
    464 };
    465 
    466 class MarkCodeClosure FINAL : public Closure {
    467  public:
    468   MarkCodeClosure(JitCodeCache* code_cache, Barrier* barrier)
    469       : code_cache_(code_cache), barrier_(barrier) {}
    470 
    471   void Run(Thread* thread) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) {
    472     ScopedTrace trace(__PRETTY_FUNCTION__);
    473     DCHECK(thread == Thread::Current() || thread->IsSuspended());
    474     MarkCodeVisitor visitor(thread, code_cache_);
    475     visitor.WalkStack();
    476     if (kIsDebugBuild) {
    477       // The stack walking code queries the side instrumentation stack if it
    478       // sees an instrumentation exit pc, so the JIT code of methods in that stack
    479       // must have been seen. We sanity check this below.
    480       for (const instrumentation::InstrumentationStackFrame& frame
    481               : *thread->GetInstrumentationStack()) {
    482         // The 'method_' in InstrumentationStackFrame is the one that has return_pc_ in
    483         // its stack frame, it is not the method owning return_pc_. We just pass null to
    484         // LookupMethodHeader: the method is only checked against in debug builds.
    485         OatQuickMethodHeader* method_header =
    486             code_cache_->LookupMethodHeader(frame.return_pc_, nullptr);
    487         if (method_header != nullptr) {
    488           const void* code = method_header->GetCode();
    489           CHECK(code_cache_->GetLiveBitmap()->Test(FromCodeToAllocation(code)));
    490         }
    491       }
    492     }
    493     barrier_->Pass(Thread::Current());
    494   }
    495 
    496  private:
    497   JitCodeCache* const code_cache_;
    498   Barrier* const barrier_;
    499 };
    500 
    501 void JitCodeCache::NotifyCollectionDone(Thread* self) {
    502   collection_in_progress_ = false;
    503   lock_cond_.Broadcast(self);
    504 }
    505 
    506 void JitCodeCache::SetFootprintLimit(size_t new_footprint) {
    507   size_t per_space_footprint = new_footprint / 2;
    508   DCHECK(IsAlignedParam(per_space_footprint, kPageSize));
    509   DCHECK_EQ(per_space_footprint * 2, new_footprint);
    510   mspace_set_footprint_limit(data_mspace_, per_space_footprint);
    511   {
    512     ScopedCodeCacheWrite scc(code_map_.get());
    513     mspace_set_footprint_limit(code_mspace_, per_space_footprint);
    514   }
    515 }
    516 
    517 bool JitCodeCache::IncreaseCodeCacheCapacity() {
    518   if (current_capacity_ == max_capacity_) {
    519     return false;
    520   }
    521 
    522   // Double the capacity if we're below 1MB, or increase it by 1MB if
    523   // we're above.
    524   if (current_capacity_ < 1 * MB) {
    525     current_capacity_ *= 2;
    526   } else {
    527     current_capacity_ += 1 * MB;
    528   }
    529   if (current_capacity_ > max_capacity_) {
    530     current_capacity_ = max_capacity_;
    531   }
    532 
    533   if (!kIsDebugBuild || VLOG_IS_ON(jit)) {
    534     LOG(INFO) << "Increasing code cache capacity to " << PrettySize(current_capacity_);
    535   }
    536 
    537   SetFootprintLimit(current_capacity_);
    538 
    539   return true;
    540 }
    541 
    542 void JitCodeCache::MarkCompiledCodeOnThreadStacks(Thread* self) {
    543   Barrier barrier(0);
    544   size_t threads_running_checkpoint = 0;
    545   MarkCodeClosure closure(this, &barrier);
    546   threads_running_checkpoint = Runtime::Current()->GetThreadList()->RunCheckpoint(&closure);
    547   // Now that we have run our checkpoint, move to a suspended state and wait
    548   // for other threads to run the checkpoint.
    549   ScopedThreadSuspension sts(self, kSuspended);
    550   if (threads_running_checkpoint != 0) {
    551     barrier.Increment(self, threads_running_checkpoint);
    552   }
    553 }
    554 
    555 bool JitCodeCache::ShouldDoFullCollection() {
    556   if (current_capacity_ == max_capacity_) {
    557     // Always do a full collection when the code cache is full.
    558     return true;
    559   } else if (current_capacity_ < kReservedCapacity) {
    560     // Always do partial collection when the code cache size is below the reserved
    561     // capacity.
    562     return false;
    563   } else if (last_collection_increased_code_cache_) {
    564     // This time do a full collection.
    565     return true;
    566   } else {
    567     // This time do a partial collection.
    568     return false;
    569   }
    570 }
    571 
    572 void JitCodeCache::GarbageCollectCache(Thread* self) {
    573   ScopedTrace trace(__FUNCTION__);
    574   if (!garbage_collect_code_) {
    575     MutexLock mu(self, lock_);
    576     IncreaseCodeCacheCapacity();
    577     return;
    578   }
    579 
    580   // Wait for an existing collection, or let everyone know we are starting one.
    581   {
    582     ScopedThreadSuspension sts(self, kSuspended);
    583     MutexLock mu(self, lock_);
    584     if (WaitForPotentialCollectionToComplete(self)) {
    585       return;
    586     } else {
    587       number_of_collections_++;
    588       live_bitmap_.reset(CodeCacheBitmap::Create(
    589           "code-cache-bitmap",
    590           reinterpret_cast<uintptr_t>(code_map_->Begin()),
    591           reinterpret_cast<uintptr_t>(code_map_->Begin() + current_capacity_ / 2)));
    592       collection_in_progress_ = true;
    593     }
    594   }
    595 
    596   TimingLogger logger("JIT code cache timing logger", true, VLOG_IS_ON(jit));
    597   {
    598     TimingLogger::ScopedTiming st("Code cache collection", &logger);
    599 
    600     bool do_full_collection = false;
    601     {
    602       MutexLock mu(self, lock_);
    603       do_full_collection = ShouldDoFullCollection();
    604     }
    605 
    606     if (!kIsDebugBuild || VLOG_IS_ON(jit)) {
    607       LOG(INFO) << "Do "
    608                 << (do_full_collection ? "full" : "partial")
    609                 << " code cache collection, code="
    610                 << PrettySize(CodeCacheSize())
    611                 << ", data=" << PrettySize(DataCacheSize());
    612     }
    613 
    614     DoCollection(self, /* collect_profiling_info */ do_full_collection);
    615 
    616     if (!kIsDebugBuild || VLOG_IS_ON(jit)) {
    617       LOG(INFO) << "After code cache collection, code="
    618                 << PrettySize(CodeCacheSize())
    619                 << ", data=" << PrettySize(DataCacheSize());
    620     }
    621 
    622     {
    623       MutexLock mu(self, lock_);
    624 
    625       // Increase the code cache only when we do partial collections.
    626       // TODO: base this strategy on how full the code cache is?
    627       if (do_full_collection) {
    628         last_collection_increased_code_cache_ = false;
    629       } else {
    630         last_collection_increased_code_cache_ = true;
    631         IncreaseCodeCacheCapacity();
    632       }
    633 
    634       bool next_collection_will_be_full = ShouldDoFullCollection();
    635 
    636       // Start polling the liveness of compiled code to prepare for the next full collection.
    637       if (next_collection_will_be_full) {
    638         // Save the entry point of methods we have compiled, and update the entry
    639         // point of those methods to the interpreter. If the method is invoked, the
    640         // interpreter will update its entry point to the compiled code and call it.
    641         for (ProfilingInfo* info : profiling_infos_) {
    642           const void* entry_point = info->GetMethod()->GetEntryPointFromQuickCompiledCode();
    643           if (ContainsPc(entry_point)) {
    644             info->SetSavedEntryPoint(entry_point);
    645             Runtime::Current()->GetInstrumentation()->UpdateMethodsCode(
    646                 info->GetMethod(), GetQuickToInterpreterBridge());
    647           }
    648         }
    649 
    650         DCHECK(CheckLiveCompiledCodeHasProfilingInfo());
    651       }
    652       live_bitmap_.reset(nullptr);
    653       NotifyCollectionDone(self);
    654     }
    655   }
    656   Runtime::Current()->GetJit()->AddTimingLogger(logger);
    657 }
    658 
    659 void JitCodeCache::RemoveUnmarkedCode(Thread* self) {
    660   ScopedTrace trace(__FUNCTION__);
    661   MutexLock mu(self, lock_);
    662   ScopedCodeCacheWrite scc(code_map_.get());
    663   // Iterate over all compiled code and remove entries that are not marked.
    664   for (auto it = method_code_map_.begin(); it != method_code_map_.end();) {
    665     const void* code_ptr = it->first;
    666     ArtMethod* method = it->second;
    667     uintptr_t allocation = FromCodeToAllocation(code_ptr);
    668     if (GetLiveBitmap()->Test(allocation)) {
    669       ++it;
    670     } else {
    671       FreeCode(code_ptr, method);
    672       it = method_code_map_.erase(it);
    673     }
    674   }
    675 }
    676 
    677 void JitCodeCache::DoCollection(Thread* self, bool collect_profiling_info) {
    678   ScopedTrace trace(__FUNCTION__);
    679   {
    680     MutexLock mu(self, lock_);
    681     if (collect_profiling_info) {
    682       // Clear the profiling info of methods that do not have compiled code as entrypoint.
    683       // Also remove the saved entry point from the ProfilingInfo objects.
    684       for (ProfilingInfo* info : profiling_infos_) {
    685         const void* ptr = info->GetMethod()->GetEntryPointFromQuickCompiledCode();
    686         if (!ContainsPc(ptr) && !info->IsInUseByCompiler()) {
    687           info->GetMethod()->SetProfilingInfo(nullptr);
    688         }
    689 
    690         if (info->GetSavedEntryPoint() != nullptr) {
    691           info->SetSavedEntryPoint(nullptr);
    692           // We are going to move this method back to interpreter. Clear the counter now to
    693           // give it a chance to be hot again.
    694           info->GetMethod()->ClearCounter();
    695         }
    696       }
    697     } else if (kIsDebugBuild) {
    698       // Sanity check that the profiling infos do not have a dangling entry point.
    699       for (ProfilingInfo* info : profiling_infos_) {
    700         DCHECK(info->GetSavedEntryPoint() == nullptr);
    701       }
    702     }
    703 
    704     // Mark compiled code that are entrypoints of ArtMethods. Compiled code that is not
    705     // an entry point is either:
    706     // - an osr compiled code, that will be removed if not in a thread call stack.
    707     // - discarded compiled code, that will be removed if not in a thread call stack.
    708     for (const auto& it : method_code_map_) {
    709       ArtMethod* method = it.second;
    710       const void* code_ptr = it.first;
    711       const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
    712       if (method_header->GetEntryPoint() == method->GetEntryPointFromQuickCompiledCode()) {
    713         GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
    714       }
    715     }
    716 
    717     // Empty osr method map, as osr compiled code will be deleted (except the ones
    718     // on thread stacks).
    719     osr_code_map_.clear();
    720   }
    721 
    722   // Run a checkpoint on all threads to mark the JIT compiled code they are running.
    723   MarkCompiledCodeOnThreadStacks(self);
    724 
    725   // At this point, mutator threads are still running, and entrypoints of methods can
    726   // change. We do know they cannot change to a code cache entry that is not marked,
    727   // therefore we can safely remove those entries.
    728   RemoveUnmarkedCode(self);
    729 
    730   if (collect_profiling_info) {
    731     ScopedThreadSuspension sts(self, kSuspended);
    732     gc::ScopedGCCriticalSection gcs(
    733         self, gc::kGcCauseJitCodeCache, gc::kCollectorTypeJitCodeCache);
    734     MutexLock mu(self, lock_);
    735     // Free all profiling infos of methods not compiled nor being compiled.
    736     auto profiling_kept_end = std::remove_if(profiling_infos_.begin(), profiling_infos_.end(),
    737       [this] (ProfilingInfo* info) NO_THREAD_SAFETY_ANALYSIS {
    738         const void* ptr = info->GetMethod()->GetEntryPointFromQuickCompiledCode();
    739         // We have previously cleared the ProfilingInfo pointer in the ArtMethod in the hope
    740         // that the compiled code would not get revived. As mutator threads run concurrently,
    741         // they may have revived the compiled code, and now we are in the situation where
    742         // a method has compiled code but no ProfilingInfo.
    743         // We make sure compiled methods have a ProfilingInfo object. It is needed for
    744         // code cache collection.
    745         if (ContainsPc(ptr) && info->GetMethod()->GetProfilingInfo(sizeof(void*)) == nullptr) {
    746           // We clear the inline caches as classes in it might be stalled.
    747           info->ClearGcRootsInInlineCaches();
    748           // Do a fence to make sure the clearing is seen before attaching to the method.
    749           QuasiAtomic::ThreadFenceRelease();
    750           info->GetMethod()->SetProfilingInfo(info);
    751         } else if (info->GetMethod()->GetProfilingInfo(sizeof(void*)) != info) {
    752           // No need for this ProfilingInfo object anymore.
    753           FreeData(reinterpret_cast<uint8_t*>(info));
    754           return true;
    755         }
    756         return false;
    757       });
    758     profiling_infos_.erase(profiling_kept_end, profiling_infos_.end());
    759     DCHECK(CheckLiveCompiledCodeHasProfilingInfo());
    760   }
    761 }
    762 
    763 bool JitCodeCache::CheckLiveCompiledCodeHasProfilingInfo() {
    764   ScopedTrace trace(__FUNCTION__);
    765   // Check that methods we have compiled do have a ProfilingInfo object. We would
    766   // have memory leaks of compiled code otherwise.
    767   for (const auto& it : method_code_map_) {
    768     ArtMethod* method = it.second;
    769     if (method->GetProfilingInfo(sizeof(void*)) == nullptr) {
    770       const void* code_ptr = it.first;
    771       const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
    772       if (method_header->GetEntryPoint() == method->GetEntryPointFromQuickCompiledCode()) {
    773         // If the code is not dead, then we have a problem. Note that this can even
    774         // happen just after a collection, as mutator threads are running in parallel
    775         // and could deoptimize an existing compiled code.
    776         return false;
    777       }
    778     }
    779   }
    780   return true;
    781 }
    782 
    783 OatQuickMethodHeader* JitCodeCache::LookupMethodHeader(uintptr_t pc, ArtMethod* method) {
    784   static_assert(kRuntimeISA != kThumb2, "kThumb2 cannot be a runtime ISA");
    785   if (kRuntimeISA == kArm) {
    786     // On Thumb-2, the pc is offset by one.
    787     --pc;
    788   }
    789   if (!ContainsPc(reinterpret_cast<const void*>(pc))) {
    790     return nullptr;
    791   }
    792 
    793   MutexLock mu(Thread::Current(), lock_);
    794   if (method_code_map_.empty()) {
    795     return nullptr;
    796   }
    797   auto it = method_code_map_.lower_bound(reinterpret_cast<const void*>(pc));
    798   --it;
    799 
    800   const void* code_ptr = it->first;
    801   OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
    802   if (!method_header->Contains(pc)) {
    803     return nullptr;
    804   }
    805   if (kIsDebugBuild && method != nullptr) {
    806     DCHECK_EQ(it->second, method)
    807         << PrettyMethod(method) << " " << PrettyMethod(it->second) << " " << std::hex << pc;
    808   }
    809   return method_header;
    810 }
    811 
    812 OatQuickMethodHeader* JitCodeCache::LookupOsrMethodHeader(ArtMethod* method) {
    813   MutexLock mu(Thread::Current(), lock_);
    814   auto it = osr_code_map_.find(method);
    815   if (it == osr_code_map_.end()) {
    816     return nullptr;
    817   }
    818   return OatQuickMethodHeader::FromCodePointer(it->second);
    819 }
    820 
    821 ProfilingInfo* JitCodeCache::AddProfilingInfo(Thread* self,
    822                                               ArtMethod* method,
    823                                               const std::vector<uint32_t>& entries,
    824                                               bool retry_allocation)
    825     // No thread safety analysis as we are using TryLock/Unlock explicitly.
    826     NO_THREAD_SAFETY_ANALYSIS {
    827   ProfilingInfo* info = nullptr;
    828   if (!retry_allocation) {
    829     // If we are allocating for the interpreter, just try to lock, to avoid
    830     // lock contention with the JIT.
    831     if (lock_.ExclusiveTryLock(self)) {
    832       info = AddProfilingInfoInternal(self, method, entries);
    833       lock_.ExclusiveUnlock(self);
    834     }
    835   } else {
    836     {
    837       MutexLock mu(self, lock_);
    838       info = AddProfilingInfoInternal(self, method, entries);
    839     }
    840 
    841     if (info == nullptr) {
    842       GarbageCollectCache(self);
    843       MutexLock mu(self, lock_);
    844       info = AddProfilingInfoInternal(self, method, entries);
    845     }
    846   }
    847   return info;
    848 }
    849 
    850 ProfilingInfo* JitCodeCache::AddProfilingInfoInternal(Thread* self ATTRIBUTE_UNUSED,
    851                                                       ArtMethod* method,
    852                                                       const std::vector<uint32_t>& entries) {
    853   size_t profile_info_size = RoundUp(
    854       sizeof(ProfilingInfo) + sizeof(InlineCache) * entries.size(),
    855       sizeof(void*));
    856 
    857   // Check whether some other thread has concurrently created it.
    858   ProfilingInfo* info = method->GetProfilingInfo(sizeof(void*));
    859   if (info != nullptr) {
    860     return info;
    861   }
    862 
    863   uint8_t* data = AllocateData(profile_info_size);
    864   if (data == nullptr) {
    865     return nullptr;
    866   }
    867   info = new (data) ProfilingInfo(method, entries);
    868 
    869   // Make sure other threads see the data in the profiling info object before the
    870   // store in the ArtMethod's ProfilingInfo pointer.
    871   QuasiAtomic::ThreadFenceRelease();
    872 
    873   method->SetProfilingInfo(info);
    874   profiling_infos_.push_back(info);
    875   histogram_profiling_info_memory_use_.AddValue(profile_info_size);
    876   return info;
    877 }
    878 
    879 // NO_THREAD_SAFETY_ANALYSIS as this is called from mspace code, at which point the lock
    880 // is already held.
    881 void* JitCodeCache::MoreCore(const void* mspace, intptr_t increment) NO_THREAD_SAFETY_ANALYSIS {
    882   if (code_mspace_ == mspace) {
    883     size_t result = code_end_;
    884     code_end_ += increment;
    885     return reinterpret_cast<void*>(result + code_map_->Begin());
    886   } else {
    887     DCHECK_EQ(data_mspace_, mspace);
    888     size_t result = data_end_;
    889     data_end_ += increment;
    890     return reinterpret_cast<void*>(result + data_map_->Begin());
    891   }
    892 }
    893 
    894 void JitCodeCache::GetProfiledMethods(const std::set<std::string>& dex_base_locations,
    895                                       std::vector<MethodReference>& methods) {
    896   ScopedTrace trace(__FUNCTION__);
    897   MutexLock mu(Thread::Current(), lock_);
    898   for (const ProfilingInfo* info : profiling_infos_) {
    899     ArtMethod* method = info->GetMethod();
    900     const DexFile* dex_file = method->GetDexFile();
    901     if (ContainsElement(dex_base_locations, dex_file->GetBaseLocation())) {
    902       methods.emplace_back(dex_file,  method->GetDexMethodIndex());
    903     }
    904   }
    905 }
    906 
    907 uint64_t JitCodeCache::GetLastUpdateTimeNs() const {
    908   return last_update_time_ns_.LoadAcquire();
    909 }
    910 
    911 bool JitCodeCache::IsOsrCompiled(ArtMethod* method) {
    912   MutexLock mu(Thread::Current(), lock_);
    913   return osr_code_map_.find(method) != osr_code_map_.end();
    914 }
    915 
    916 bool JitCodeCache::NotifyCompilationOf(ArtMethod* method, Thread* self, bool osr) {
    917   if (!osr && ContainsPc(method->GetEntryPointFromQuickCompiledCode())) {
    918     return false;
    919   }
    920 
    921   MutexLock mu(self, lock_);
    922   if (osr && (osr_code_map_.find(method) != osr_code_map_.end())) {
    923     return false;
    924   }
    925 
    926   ProfilingInfo* info = method->GetProfilingInfo(sizeof(void*));
    927   if (info == nullptr) {
    928     VLOG(jit) << PrettyMethod(method) << " needs a ProfilingInfo to be compiled";
    929     // Because the counter is not atomic, there are some rare cases where we may not
    930     // hit the threshold for creating the ProfilingInfo. Reset the counter now to
    931     // "correct" this.
    932     method->ClearCounter();
    933     return false;
    934   }
    935 
    936   if (info->IsMethodBeingCompiled(osr)) {
    937     return false;
    938   }
    939 
    940   info->SetIsMethodBeingCompiled(true, osr);
    941   return true;
    942 }
    943 
    944 ProfilingInfo* JitCodeCache::NotifyCompilerUse(ArtMethod* method, Thread* self) {
    945   MutexLock mu(self, lock_);
    946   ProfilingInfo* info = method->GetProfilingInfo(sizeof(void*));
    947   if (info != nullptr) {
    948     info->IncrementInlineUse();
    949   }
    950   return info;
    951 }
    952 
    953 void JitCodeCache::DoneCompilerUse(ArtMethod* method, Thread* self) {
    954   MutexLock mu(self, lock_);
    955   ProfilingInfo* info = method->GetProfilingInfo(sizeof(void*));
    956   DCHECK(info != nullptr);
    957   info->DecrementInlineUse();
    958 }
    959 
    960 void JitCodeCache::DoneCompiling(ArtMethod* method, Thread* self ATTRIBUTE_UNUSED, bool osr) {
    961   ProfilingInfo* info = method->GetProfilingInfo(sizeof(void*));
    962   DCHECK(info->IsMethodBeingCompiled(osr));
    963   info->SetIsMethodBeingCompiled(false, osr);
    964 }
    965 
    966 size_t JitCodeCache::GetMemorySizeOfCodePointer(const void* ptr) {
    967   MutexLock mu(Thread::Current(), lock_);
    968   return mspace_usable_size(reinterpret_cast<const void*>(FromCodeToAllocation(ptr)));
    969 }
    970 
    971 void JitCodeCache::InvalidateCompiledCodeFor(ArtMethod* method,
    972                                              const OatQuickMethodHeader* header) {
    973   ProfilingInfo* profiling_info = method->GetProfilingInfo(sizeof(void*));
    974   if ((profiling_info != nullptr) &&
    975       (profiling_info->GetSavedEntryPoint() == header->GetEntryPoint())) {
    976     // Prevent future uses of the compiled code.
    977     profiling_info->SetSavedEntryPoint(nullptr);
    978   }
    979 
    980   if (method->GetEntryPointFromQuickCompiledCode() == header->GetEntryPoint()) {
    981     // The entrypoint is the one to invalidate, so we just update
    982     // it to the interpreter entry point and clear the counter to get the method
    983     // Jitted again.
    984     Runtime::Current()->GetInstrumentation()->UpdateMethodsCode(
    985         method, GetQuickToInterpreterBridge());
    986     method->ClearCounter();
    987   } else {
    988     MutexLock mu(Thread::Current(), lock_);
    989     auto it = osr_code_map_.find(method);
    990     if (it != osr_code_map_.end() && OatQuickMethodHeader::FromCodePointer(it->second) == header) {
    991       // Remove the OSR method, to avoid using it again.
    992       osr_code_map_.erase(it);
    993     }
    994   }
    995   MutexLock mu(Thread::Current(), lock_);
    996   number_of_deoptimizations_++;
    997 }
    998 
    999 uint8_t* JitCodeCache::AllocateCode(size_t code_size) {
   1000   size_t alignment = GetInstructionSetAlignment(kRuntimeISA);
   1001   uint8_t* result = reinterpret_cast<uint8_t*>(
   1002       mspace_memalign(code_mspace_, alignment, code_size));
   1003   size_t header_size = RoundUp(sizeof(OatQuickMethodHeader), alignment);
   1004   // Ensure the header ends up at expected instruction alignment.
   1005   DCHECK_ALIGNED_PARAM(reinterpret_cast<uintptr_t>(result + header_size), alignment);
   1006   used_memory_for_code_ += mspace_usable_size(result);
   1007   return result;
   1008 }
   1009 
   1010 void JitCodeCache::FreeCode(uint8_t* code) {
   1011   used_memory_for_code_ -= mspace_usable_size(code);
   1012   mspace_free(code_mspace_, code);
   1013 }
   1014 
   1015 uint8_t* JitCodeCache::AllocateData(size_t data_size) {
   1016   void* result = mspace_malloc(data_mspace_, data_size);
   1017   used_memory_for_data_ += mspace_usable_size(result);
   1018   return reinterpret_cast<uint8_t*>(result);
   1019 }
   1020 
   1021 void JitCodeCache::FreeData(uint8_t* data) {
   1022   used_memory_for_data_ -= mspace_usable_size(data);
   1023   mspace_free(data_mspace_, data);
   1024 }
   1025 
   1026 void JitCodeCache::Dump(std::ostream& os) {
   1027   MutexLock mu(Thread::Current(), lock_);
   1028   os << "Current JIT code cache size: " << PrettySize(used_memory_for_code_) << "\n"
   1029      << "Current JIT data cache size: " << PrettySize(used_memory_for_data_) << "\n"
   1030      << "Current JIT capacity: " << PrettySize(current_capacity_) << "\n"
   1031      << "Current number of JIT code cache entries: " << method_code_map_.size() << "\n"
   1032      << "Total number of JIT compilations: " << number_of_compilations_ << "\n"
   1033      << "Total number of JIT compilations for on stack replacement: "
   1034         << number_of_osr_compilations_ << "\n"
   1035      << "Total number of deoptimizations: " << number_of_deoptimizations_ << "\n"
   1036      << "Total number of JIT code cache collections: " << number_of_collections_ << std::endl;
   1037   histogram_stack_map_memory_use_.PrintMemoryUse(os);
   1038   histogram_code_memory_use_.PrintMemoryUse(os);
   1039   histogram_profiling_info_memory_use_.PrintMemoryUse(os);
   1040 }
   1041 
   1042 }  // namespace jit
   1043 }  // namespace art
   1044