Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "instrumentation.h"
     18 
     19 #include <sstream>
     20 
     21 #include "arch/context.h"
     22 #include "art_field-inl.h"
     23 #include "art_method-inl.h"
     24 #include "base/atomic.h"
     25 #include "base/callee_save_type.h"
     26 #include "class_linker.h"
     27 #include "debugger.h"
     28 #include "dex/dex_file-inl.h"
     29 #include "dex/dex_file_types.h"
     30 #include "dex/dex_instruction-inl.h"
     31 #include "entrypoints/quick/quick_alloc_entrypoints.h"
     32 #include "entrypoints/quick/quick_entrypoints.h"
     33 #include "entrypoints/runtime_asm_entrypoints.h"
     34 #include "gc_root-inl.h"
     35 #include "interpreter/interpreter.h"
     36 #include "interpreter/interpreter_common.h"
     37 #include "jit/jit.h"
     38 #include "jit/jit_code_cache.h"
     39 #include "jvalue-inl.h"
     40 #include "mirror/class-inl.h"
     41 #include "mirror/dex_cache.h"
     42 #include "mirror/object-inl.h"
     43 #include "mirror/object_array-inl.h"
     44 #include "nth_caller_visitor.h"
     45 #include "oat_quick_method_header.h"
     46 #include "thread.h"
     47 #include "thread_list.h"
     48 
     49 namespace art {
     50 namespace instrumentation {
     51 
     52 constexpr bool kVerboseInstrumentation = false;
     53 
     54 void InstrumentationListener::MethodExited(Thread* thread,
     55                                            Handle<mirror::Object> this_object,
     56                                            ArtMethod* method,
     57                                            uint32_t dex_pc,
     58                                            Handle<mirror::Object> return_value) {
     59   DCHECK_EQ(method->GetInterfaceMethodIfProxy(kRuntimePointerSize)->GetReturnTypePrimitive(),
     60             Primitive::kPrimNot);
     61   JValue v;
     62   v.SetL(return_value.Get());
     63   MethodExited(thread, this_object, method, dex_pc, v);
     64 }
     65 
     66 void InstrumentationListener::FieldWritten(Thread* thread,
     67                                            Handle<mirror::Object> this_object,
     68                                            ArtMethod* method,
     69                                            uint32_t dex_pc,
     70                                            ArtField* field,
     71                                            Handle<mirror::Object> field_value) {
     72   DCHECK(!field->IsPrimitiveType());
     73   JValue v;
     74   v.SetL(field_value.Get());
     75   FieldWritten(thread, this_object, method, dex_pc, field, v);
     76 }
     77 
     78 // Instrumentation works on non-inlined frames by updating returned PCs
     79 // of compiled frames.
     80 static constexpr StackVisitor::StackWalkKind kInstrumentationStackWalk =
     81     StackVisitor::StackWalkKind::kSkipInlinedFrames;
     82 
     83 class InstallStubsClassVisitor : public ClassVisitor {
     84  public:
     85   explicit InstallStubsClassVisitor(Instrumentation* instrumentation)
     86       : instrumentation_(instrumentation) {}
     87 
     88   bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES(Locks::mutator_lock_) {
     89     instrumentation_->InstallStubsForClass(klass.Ptr());
     90     return true;  // we visit all classes.
     91   }
     92 
     93  private:
     94   Instrumentation* const instrumentation_;
     95 };
     96 
     97 
     98 Instrumentation::Instrumentation()
     99     : instrumentation_stubs_installed_(false),
    100       entry_exit_stubs_installed_(false),
    101       interpreter_stubs_installed_(false),
    102       interpret_only_(false),
    103       forced_interpret_only_(false),
    104       have_method_entry_listeners_(false),
    105       have_method_exit_listeners_(false),
    106       have_method_unwind_listeners_(false),
    107       have_dex_pc_listeners_(false),
    108       have_field_read_listeners_(false),
    109       have_field_write_listeners_(false),
    110       have_exception_thrown_listeners_(false),
    111       have_watched_frame_pop_listeners_(false),
    112       have_branch_listeners_(false),
    113       have_invoke_virtual_or_interface_listeners_(false),
    114       have_exception_handled_listeners_(false),
    115       deoptimized_methods_lock_("deoptimized methods lock", kDeoptimizedMethodsLock),
    116       deoptimization_enabled_(false),
    117       interpreter_handler_table_(kMainHandlerTable),
    118       quick_alloc_entry_points_instrumentation_counter_(0),
    119       alloc_entrypoints_instrumented_(false) {
    120 }
    121 
    122 void Instrumentation::InstallStubsForClass(mirror::Class* klass) {
    123   if (!klass->IsResolved()) {
    124     // We need the class to be resolved to install/uninstall stubs. Otherwise its methods
    125     // could not be initialized or linked with regards to class inheritance.
    126   } else if (klass->IsErroneousResolved()) {
    127     // We can't execute code in a erroneous class: do nothing.
    128   } else {
    129     for (ArtMethod& method : klass->GetMethods(kRuntimePointerSize)) {
    130       InstallStubsForMethod(&method);
    131     }
    132   }
    133 }
    134 
    135 static void UpdateEntrypoints(ArtMethod* method, const void* quick_code)
    136     REQUIRES_SHARED(Locks::mutator_lock_) {
    137   method->SetEntryPointFromQuickCompiledCode(quick_code);
    138 }
    139 
    140 bool Instrumentation::NeedDebugVersionFor(ArtMethod* method) const
    141     REQUIRES_SHARED(Locks::mutator_lock_) {
    142   art::Runtime* runtime = Runtime::Current();
    143   // If anything says we need the debug version or we are debuggable we will need the debug version
    144   // of the method.
    145   return (runtime->GetRuntimeCallbacks()->MethodNeedsDebugVersion(method) ||
    146           runtime->IsJavaDebuggable()) &&
    147          !method->IsNative() &&
    148          !method->IsProxyMethod();
    149 }
    150 
    151 void Instrumentation::InstallStubsForMethod(ArtMethod* method) {
    152   if (!method->IsInvokable() || method->IsProxyMethod()) {
    153     // Do not change stubs for these methods.
    154     return;
    155   }
    156   // Don't stub Proxy.<init>. Note that the Proxy class itself is not a proxy class.
    157   if (method->IsConstructor() &&
    158       method->GetDeclaringClass()->DescriptorEquals("Ljava/lang/reflect/Proxy;")) {
    159     return;
    160   }
    161   const void* new_quick_code;
    162   bool uninstall = !entry_exit_stubs_installed_ && !interpreter_stubs_installed_;
    163   Runtime* const runtime = Runtime::Current();
    164   ClassLinker* const class_linker = runtime->GetClassLinker();
    165   bool is_class_initialized = method->GetDeclaringClass()->IsInitialized();
    166   if (uninstall) {
    167     if ((forced_interpret_only_ || IsDeoptimized(method)) && !method->IsNative()) {
    168       new_quick_code = GetQuickToInterpreterBridge();
    169     } else if (is_class_initialized || !method->IsStatic() || method->IsConstructor()) {
    170       if (NeedDebugVersionFor(method)) {
    171         new_quick_code = GetQuickToInterpreterBridge();
    172       } else {
    173         new_quick_code = class_linker->GetQuickOatCodeFor(method);
    174       }
    175     } else {
    176       new_quick_code = GetQuickResolutionStub();
    177     }
    178   } else {  // !uninstall
    179     if ((interpreter_stubs_installed_ || forced_interpret_only_ || IsDeoptimized(method)) &&
    180         !method->IsNative()) {
    181       new_quick_code = GetQuickToInterpreterBridge();
    182     } else {
    183       // Do not overwrite resolution trampoline. When the trampoline initializes the method's
    184       // class, all its static methods code will be set to the instrumentation entry point.
    185       // For more details, see ClassLinker::FixupStaticTrampolines.
    186       if (is_class_initialized || !method->IsStatic() || method->IsConstructor()) {
    187         if (NeedDebugVersionFor(method)) {
    188           // Oat code should not be used. Don't install instrumentation stub and
    189           // use interpreter for instrumentation.
    190           new_quick_code = GetQuickToInterpreterBridge();
    191         } else if (entry_exit_stubs_installed_) {
    192           new_quick_code = GetQuickInstrumentationEntryPoint();
    193         } else {
    194           new_quick_code = class_linker->GetQuickOatCodeFor(method);
    195         }
    196       } else {
    197         new_quick_code = GetQuickResolutionStub();
    198       }
    199     }
    200   }
    201   UpdateEntrypoints(method, new_quick_code);
    202 }
    203 
    204 // Places the instrumentation exit pc as the return PC for every quick frame. This also allows
    205 // deoptimization of quick frames to interpreter frames.
    206 // Since we may already have done this previously, we need to push new instrumentation frame before
    207 // existing instrumentation frames.
    208 static void InstrumentationInstallStack(Thread* thread, void* arg)
    209     REQUIRES_SHARED(Locks::mutator_lock_) {
    210   struct InstallStackVisitor FINAL : public StackVisitor {
    211     InstallStackVisitor(Thread* thread_in, Context* context, uintptr_t instrumentation_exit_pc)
    212         : StackVisitor(thread_in, context, kInstrumentationStackWalk),
    213           instrumentation_stack_(thread_in->GetInstrumentationStack()),
    214           instrumentation_exit_pc_(instrumentation_exit_pc),
    215           reached_existing_instrumentation_frames_(false), instrumentation_stack_depth_(0),
    216           last_return_pc_(0) {
    217     }
    218 
    219     bool VisitFrame() OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
    220       ArtMethod* m = GetMethod();
    221       if (m == nullptr) {
    222         if (kVerboseInstrumentation) {
    223           LOG(INFO) << "  Skipping upcall. Frame " << GetFrameId();
    224         }
    225         last_return_pc_ = 0;
    226         return true;  // Ignore upcalls.
    227       }
    228       if (GetCurrentQuickFrame() == nullptr) {
    229         bool interpreter_frame = true;
    230         InstrumentationStackFrame instrumentation_frame(GetThisObject(), m, 0, GetFrameId(),
    231                                                         interpreter_frame);
    232         if (kVerboseInstrumentation) {
    233           LOG(INFO) << "Pushing shadow frame " << instrumentation_frame.Dump();
    234         }
    235         shadow_stack_.push_back(instrumentation_frame);
    236         return true;  // Continue.
    237       }
    238       uintptr_t return_pc = GetReturnPc();
    239       if (kVerboseInstrumentation) {
    240         LOG(INFO) << "  Installing exit stub in " << DescribeLocation();
    241       }
    242       if (return_pc == instrumentation_exit_pc_) {
    243         CHECK_LT(instrumentation_stack_depth_, instrumentation_stack_->size());
    244 
    245         if (m->IsRuntimeMethod()) {
    246           const InstrumentationStackFrame& frame =
    247               instrumentation_stack_->at(instrumentation_stack_depth_);
    248           if (frame.interpreter_entry_) {
    249             // This instrumentation frame is for an interpreter bridge and is
    250             // pushed when executing the instrumented interpreter bridge. So method
    251             // enter event must have been reported. However we need to push a DEX pc
    252             // into the dex_pcs_ list to match size of instrumentation stack.
    253             uint32_t dex_pc = dex::kDexNoIndex;
    254             dex_pcs_.push_back(dex_pc);
    255             last_return_pc_ = frame.return_pc_;
    256             ++instrumentation_stack_depth_;
    257             return true;
    258           }
    259         }
    260 
    261         // We've reached a frame which has already been installed with instrumentation exit stub.
    262         // We should have already installed instrumentation or be interpreter on previous frames.
    263         reached_existing_instrumentation_frames_ = true;
    264 
    265         const InstrumentationStackFrame& frame =
    266             instrumentation_stack_->at(instrumentation_stack_depth_);
    267         CHECK_EQ(m, frame.method_) << "Expected " << ArtMethod::PrettyMethod(m)
    268                                    << ", Found " << ArtMethod::PrettyMethod(frame.method_);
    269         return_pc = frame.return_pc_;
    270         if (kVerboseInstrumentation) {
    271           LOG(INFO) << "Ignoring already instrumented " << frame.Dump();
    272         }
    273       } else {
    274         CHECK_NE(return_pc, 0U);
    275         if (UNLIKELY(reached_existing_instrumentation_frames_ && !m->IsRuntimeMethod())) {
    276           // We already saw an existing instrumentation frame so this should be a runtime-method
    277           // inserted by the interpreter or runtime.
    278           std::string thread_name;
    279           GetThread()->GetThreadName(thread_name);
    280           uint32_t dex_pc = dex::kDexNoIndex;
    281           if (last_return_pc_ != 0 &&
    282               GetCurrentOatQuickMethodHeader() != nullptr) {
    283             dex_pc = GetCurrentOatQuickMethodHeader()->ToDexPc(m, last_return_pc_);
    284           }
    285           LOG(FATAL) << "While walking " << thread_name << " found unexpected non-runtime method"
    286                      << " without instrumentation exit return or interpreter frame."
    287                      << " method is " << GetMethod()->PrettyMethod()
    288                      << " return_pc is " << std::hex << return_pc
    289                      << " dex pc: " << dex_pc;
    290           UNREACHABLE();
    291         }
    292         InstrumentationStackFrame instrumentation_frame(
    293             m->IsRuntimeMethod() ? nullptr : GetThisObject(),
    294             m,
    295             return_pc,
    296             GetFrameId(),    // A runtime method still gets a frame id.
    297             false);
    298         if (kVerboseInstrumentation) {
    299           LOG(INFO) << "Pushing frame " << instrumentation_frame.Dump();
    300         }
    301 
    302         // Insert frame at the right position so we do not corrupt the instrumentation stack.
    303         // Instrumentation stack frames are in descending frame id order.
    304         auto it = instrumentation_stack_->begin();
    305         for (auto end = instrumentation_stack_->end(); it != end; ++it) {
    306           const InstrumentationStackFrame& current = *it;
    307           if (instrumentation_frame.frame_id_ >= current.frame_id_) {
    308             break;
    309           }
    310         }
    311         instrumentation_stack_->insert(it, instrumentation_frame);
    312         SetReturnPc(instrumentation_exit_pc_);
    313       }
    314       uint32_t dex_pc = dex::kDexNoIndex;
    315       if (last_return_pc_ != 0 &&
    316           GetCurrentOatQuickMethodHeader() != nullptr) {
    317         dex_pc = GetCurrentOatQuickMethodHeader()->ToDexPc(m, last_return_pc_);
    318       }
    319       dex_pcs_.push_back(dex_pc);
    320       last_return_pc_ = return_pc;
    321       ++instrumentation_stack_depth_;
    322       return true;  // Continue.
    323     }
    324     std::deque<InstrumentationStackFrame>* const instrumentation_stack_;
    325     std::vector<InstrumentationStackFrame> shadow_stack_;
    326     std::vector<uint32_t> dex_pcs_;
    327     const uintptr_t instrumentation_exit_pc_;
    328     bool reached_existing_instrumentation_frames_;
    329     size_t instrumentation_stack_depth_;
    330     uintptr_t last_return_pc_;
    331   };
    332   if (kVerboseInstrumentation) {
    333     std::string thread_name;
    334     thread->GetThreadName(thread_name);
    335     LOG(INFO) << "Installing exit stubs in " << thread_name;
    336   }
    337 
    338   Instrumentation* instrumentation = reinterpret_cast<Instrumentation*>(arg);
    339   std::unique_ptr<Context> context(Context::Create());
    340   uintptr_t instrumentation_exit_pc = reinterpret_cast<uintptr_t>(GetQuickInstrumentationExitPc());
    341   InstallStackVisitor visitor(thread, context.get(), instrumentation_exit_pc);
    342   visitor.WalkStack(true);
    343   CHECK_EQ(visitor.dex_pcs_.size(), thread->GetInstrumentationStack()->size());
    344 
    345   if (instrumentation->ShouldNotifyMethodEnterExitEvents()) {
    346     // Create method enter events for all methods currently on the thread's stack. We only do this
    347     // if no debugger is attached to prevent from posting events twice.
    348     auto ssi = visitor.shadow_stack_.rbegin();
    349     for (auto isi = thread->GetInstrumentationStack()->rbegin(),
    350         end = thread->GetInstrumentationStack()->rend(); isi != end; ++isi) {
    351       while (ssi != visitor.shadow_stack_.rend() && (*ssi).frame_id_ < (*isi).frame_id_) {
    352         instrumentation->MethodEnterEvent(thread, (*ssi).this_object_, (*ssi).method_, 0);
    353         ++ssi;
    354       }
    355       uint32_t dex_pc = visitor.dex_pcs_.back();
    356       visitor.dex_pcs_.pop_back();
    357       if (!isi->interpreter_entry_) {
    358         instrumentation->MethodEnterEvent(thread, (*isi).this_object_, (*isi).method_, dex_pc);
    359       }
    360     }
    361   }
    362   thread->VerifyStack();
    363 }
    364 
    365 void Instrumentation::InstrumentThreadStack(Thread* thread) {
    366   instrumentation_stubs_installed_ = true;
    367   InstrumentationInstallStack(thread, this);
    368 }
    369 
    370 // Removes the instrumentation exit pc as the return PC for every quick frame.
    371 static void InstrumentationRestoreStack(Thread* thread, void* arg)
    372     REQUIRES(Locks::mutator_lock_) {
    373   Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current());
    374 
    375   struct RestoreStackVisitor FINAL : public StackVisitor {
    376     RestoreStackVisitor(Thread* thread_in, uintptr_t instrumentation_exit_pc,
    377                         Instrumentation* instrumentation)
    378         : StackVisitor(thread_in, nullptr, kInstrumentationStackWalk),
    379           thread_(thread_in),
    380           instrumentation_exit_pc_(instrumentation_exit_pc),
    381           instrumentation_(instrumentation),
    382           instrumentation_stack_(thread_in->GetInstrumentationStack()),
    383           frames_removed_(0) {}
    384 
    385     bool VisitFrame() OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
    386       if (instrumentation_stack_->size() == 0) {
    387         return false;  // Stop.
    388       }
    389       ArtMethod* m = GetMethod();
    390       if (GetCurrentQuickFrame() == nullptr) {
    391         if (kVerboseInstrumentation) {
    392           LOG(INFO) << "  Ignoring a shadow frame. Frame " << GetFrameId()
    393               << " Method=" << ArtMethod::PrettyMethod(m);
    394         }
    395         return true;  // Ignore shadow frames.
    396       }
    397       if (m == nullptr) {
    398         if (kVerboseInstrumentation) {
    399           LOG(INFO) << "  Skipping upcall. Frame " << GetFrameId();
    400         }
    401         return true;  // Ignore upcalls.
    402       }
    403       bool removed_stub = false;
    404       // TODO: make this search more efficient?
    405       const size_t frameId = GetFrameId();
    406       for (const InstrumentationStackFrame& instrumentation_frame : *instrumentation_stack_) {
    407         if (instrumentation_frame.frame_id_ == frameId) {
    408           if (kVerboseInstrumentation) {
    409             LOG(INFO) << "  Removing exit stub in " << DescribeLocation();
    410           }
    411           if (instrumentation_frame.interpreter_entry_) {
    412             CHECK(m == Runtime::Current()->GetCalleeSaveMethod(CalleeSaveType::kSaveRefsAndArgs));
    413           } else {
    414             CHECK(m == instrumentation_frame.method_) << ArtMethod::PrettyMethod(m);
    415           }
    416           SetReturnPc(instrumentation_frame.return_pc_);
    417           if (instrumentation_->ShouldNotifyMethodEnterExitEvents() &&
    418               !m->IsRuntimeMethod()) {
    419             // Create the method exit events. As the methods didn't really exit the result is 0.
    420             // We only do this if no debugger is attached to prevent from posting events twice.
    421             instrumentation_->MethodExitEvent(thread_, instrumentation_frame.this_object_, m,
    422                                               GetDexPc(), JValue());
    423           }
    424           frames_removed_++;
    425           removed_stub = true;
    426           break;
    427         }
    428       }
    429       if (!removed_stub) {
    430         if (kVerboseInstrumentation) {
    431           LOG(INFO) << "  No exit stub in " << DescribeLocation();
    432         }
    433       }
    434       return true;  // Continue.
    435     }
    436     Thread* const thread_;
    437     const uintptr_t instrumentation_exit_pc_;
    438     Instrumentation* const instrumentation_;
    439     std::deque<instrumentation::InstrumentationStackFrame>* const instrumentation_stack_;
    440     size_t frames_removed_;
    441   };
    442   if (kVerboseInstrumentation) {
    443     std::string thread_name;
    444     thread->GetThreadName(thread_name);
    445     LOG(INFO) << "Removing exit stubs in " << thread_name;
    446   }
    447   std::deque<instrumentation::InstrumentationStackFrame>* stack = thread->GetInstrumentationStack();
    448   if (stack->size() > 0) {
    449     Instrumentation* instrumentation = reinterpret_cast<Instrumentation*>(arg);
    450     uintptr_t instrumentation_exit_pc =
    451         reinterpret_cast<uintptr_t>(GetQuickInstrumentationExitPc());
    452     RestoreStackVisitor visitor(thread, instrumentation_exit_pc, instrumentation);
    453     visitor.WalkStack(true);
    454     CHECK_EQ(visitor.frames_removed_, stack->size());
    455     while (stack->size() > 0) {
    456       stack->pop_front();
    457     }
    458   }
    459 }
    460 
    461 static bool HasEvent(Instrumentation::InstrumentationEvent expected, uint32_t events) {
    462   return (events & expected) != 0;
    463 }
    464 
    465 static void PotentiallyAddListenerTo(Instrumentation::InstrumentationEvent event,
    466                                      uint32_t events,
    467                                      std::list<InstrumentationListener*>& list,
    468                                      InstrumentationListener* listener,
    469                                      bool* has_listener)
    470     REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) {
    471   Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current());
    472   if (!HasEvent(event, events)) {
    473     return;
    474   }
    475   // If there is a free slot in the list, we insert the listener in that slot.
    476   // Otherwise we add it to the end of the list.
    477   auto it = std::find(list.begin(), list.end(), nullptr);
    478   if (it != list.end()) {
    479     *it = listener;
    480   } else {
    481     list.push_back(listener);
    482   }
    483   *has_listener = true;
    484 }
    485 
    486 void Instrumentation::AddListener(InstrumentationListener* listener, uint32_t events) {
    487   Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current());
    488   PotentiallyAddListenerTo(kMethodEntered,
    489                            events,
    490                            method_entry_listeners_,
    491                            listener,
    492                            &have_method_entry_listeners_);
    493   PotentiallyAddListenerTo(kMethodExited,
    494                            events,
    495                            method_exit_listeners_,
    496                            listener,
    497                            &have_method_exit_listeners_);
    498   PotentiallyAddListenerTo(kMethodUnwind,
    499                            events,
    500                            method_unwind_listeners_,
    501                            listener,
    502                            &have_method_unwind_listeners_);
    503   PotentiallyAddListenerTo(kBranch,
    504                            events,
    505                            branch_listeners_,
    506                            listener,
    507                            &have_branch_listeners_);
    508   PotentiallyAddListenerTo(kInvokeVirtualOrInterface,
    509                            events,
    510                            invoke_virtual_or_interface_listeners_,
    511                            listener,
    512                            &have_invoke_virtual_or_interface_listeners_);
    513   PotentiallyAddListenerTo(kDexPcMoved,
    514                            events,
    515                            dex_pc_listeners_,
    516                            listener,
    517                            &have_dex_pc_listeners_);
    518   PotentiallyAddListenerTo(kFieldRead,
    519                            events,
    520                            field_read_listeners_,
    521                            listener,
    522                            &have_field_read_listeners_);
    523   PotentiallyAddListenerTo(kFieldWritten,
    524                            events,
    525                            field_write_listeners_,
    526                            listener,
    527                            &have_field_write_listeners_);
    528   PotentiallyAddListenerTo(kExceptionThrown,
    529                            events,
    530                            exception_thrown_listeners_,
    531                            listener,
    532                            &have_exception_thrown_listeners_);
    533   PotentiallyAddListenerTo(kWatchedFramePop,
    534                            events,
    535                            watched_frame_pop_listeners_,
    536                            listener,
    537                            &have_watched_frame_pop_listeners_);
    538   PotentiallyAddListenerTo(kExceptionHandled,
    539                            events,
    540                            exception_handled_listeners_,
    541                            listener,
    542                            &have_exception_handled_listeners_);
    543   UpdateInterpreterHandlerTable();
    544 }
    545 
    546 static void PotentiallyRemoveListenerFrom(Instrumentation::InstrumentationEvent event,
    547                                           uint32_t events,
    548                                           std::list<InstrumentationListener*>& list,
    549                                           InstrumentationListener* listener,
    550                                           bool* has_listener)
    551     REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) {
    552   Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current());
    553   if (!HasEvent(event, events)) {
    554     return;
    555   }
    556   auto it = std::find(list.begin(), list.end(), listener);
    557   if (it != list.end()) {
    558     // Just update the entry, do not remove from the list. Removing entries in the list
    559     // is unsafe when mutators are iterating over it.
    560     *it = nullptr;
    561   }
    562 
    563   // Check if the list contains any non-null listener, and update 'has_listener'.
    564   for (InstrumentationListener* l : list) {
    565     if (l != nullptr) {
    566       *has_listener = true;
    567       return;
    568     }
    569   }
    570   *has_listener = false;
    571 }
    572 
    573 void Instrumentation::RemoveListener(InstrumentationListener* listener, uint32_t events) {
    574   Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current());
    575   PotentiallyRemoveListenerFrom(kMethodEntered,
    576                                 events,
    577                                 method_entry_listeners_,
    578                                 listener,
    579                                 &have_method_entry_listeners_);
    580   PotentiallyRemoveListenerFrom(kMethodExited,
    581                                 events,
    582                                 method_exit_listeners_,
    583                                 listener,
    584                                 &have_method_exit_listeners_);
    585   PotentiallyRemoveListenerFrom(kMethodUnwind,
    586                                 events,
    587                                 method_unwind_listeners_,
    588                                 listener,
    589                                 &have_method_unwind_listeners_);
    590   PotentiallyRemoveListenerFrom(kBranch,
    591                                 events,
    592                                 branch_listeners_,
    593                                 listener,
    594                                 &have_branch_listeners_);
    595   PotentiallyRemoveListenerFrom(kInvokeVirtualOrInterface,
    596                                 events,
    597                                 invoke_virtual_or_interface_listeners_,
    598                                 listener,
    599                                 &have_invoke_virtual_or_interface_listeners_);
    600   PotentiallyRemoveListenerFrom(kDexPcMoved,
    601                                 events,
    602                                 dex_pc_listeners_,
    603                                 listener,
    604                                 &have_dex_pc_listeners_);
    605   PotentiallyRemoveListenerFrom(kFieldRead,
    606                                 events,
    607                                 field_read_listeners_,
    608                                 listener,
    609                                 &have_field_read_listeners_);
    610   PotentiallyRemoveListenerFrom(kFieldWritten,
    611                                 events,
    612                                 field_write_listeners_,
    613                                 listener,
    614                                 &have_field_write_listeners_);
    615   PotentiallyRemoveListenerFrom(kExceptionThrown,
    616                                 events,
    617                                 exception_thrown_listeners_,
    618                                 listener,
    619                                 &have_exception_thrown_listeners_);
    620   PotentiallyRemoveListenerFrom(kWatchedFramePop,
    621                                 events,
    622                                 watched_frame_pop_listeners_,
    623                                 listener,
    624                                 &have_watched_frame_pop_listeners_);
    625   PotentiallyRemoveListenerFrom(kExceptionHandled,
    626                                 events,
    627                                 exception_handled_listeners_,
    628                                 listener,
    629                                 &have_exception_handled_listeners_);
    630   UpdateInterpreterHandlerTable();
    631 }
    632 
    633 Instrumentation::InstrumentationLevel Instrumentation::GetCurrentInstrumentationLevel() const {
    634   if (interpreter_stubs_installed_) {
    635     return InstrumentationLevel::kInstrumentWithInterpreter;
    636   } else if (entry_exit_stubs_installed_) {
    637     return InstrumentationLevel::kInstrumentWithInstrumentationStubs;
    638   } else {
    639     return InstrumentationLevel::kInstrumentNothing;
    640   }
    641 }
    642 
    643 bool Instrumentation::RequiresInstrumentationInstallation(InstrumentationLevel new_level) const {
    644   // We need to reinstall instrumentation if we go to a different level.
    645   return GetCurrentInstrumentationLevel() != new_level;
    646 }
    647 
    648 void Instrumentation::ConfigureStubs(const char* key, InstrumentationLevel desired_level) {
    649   // Store the instrumentation level for this key or remove it.
    650   if (desired_level == InstrumentationLevel::kInstrumentNothing) {
    651     // The client no longer needs instrumentation.
    652     requested_instrumentation_levels_.erase(key);
    653   } else {
    654     // The client needs instrumentation.
    655     requested_instrumentation_levels_.Overwrite(key, desired_level);
    656   }
    657 
    658   // Look for the highest required instrumentation level.
    659   InstrumentationLevel requested_level = InstrumentationLevel::kInstrumentNothing;
    660   for (const auto& v : requested_instrumentation_levels_) {
    661     requested_level = std::max(requested_level, v.second);
    662   }
    663 
    664   interpret_only_ = (requested_level == InstrumentationLevel::kInstrumentWithInterpreter) ||
    665                     forced_interpret_only_;
    666 
    667   if (!RequiresInstrumentationInstallation(requested_level)) {
    668     // We're already set.
    669     return;
    670   }
    671   Thread* const self = Thread::Current();
    672   Runtime* runtime = Runtime::Current();
    673   Locks::mutator_lock_->AssertExclusiveHeld(self);
    674   Locks::thread_list_lock_->AssertNotHeld(self);
    675   if (requested_level > InstrumentationLevel::kInstrumentNothing) {
    676     if (requested_level == InstrumentationLevel::kInstrumentWithInterpreter) {
    677       interpreter_stubs_installed_ = true;
    678       entry_exit_stubs_installed_ = true;
    679     } else {
    680       CHECK_EQ(requested_level, InstrumentationLevel::kInstrumentWithInstrumentationStubs);
    681       entry_exit_stubs_installed_ = true;
    682       interpreter_stubs_installed_ = false;
    683     }
    684     InstallStubsClassVisitor visitor(this);
    685     runtime->GetClassLinker()->VisitClasses(&visitor);
    686     instrumentation_stubs_installed_ = true;
    687     MutexLock mu(self, *Locks::thread_list_lock_);
    688     runtime->GetThreadList()->ForEach(InstrumentationInstallStack, this);
    689   } else {
    690     interpreter_stubs_installed_ = false;
    691     entry_exit_stubs_installed_ = false;
    692     InstallStubsClassVisitor visitor(this);
    693     runtime->GetClassLinker()->VisitClasses(&visitor);
    694     // Restore stack only if there is no method currently deoptimized.
    695     bool empty;
    696     {
    697       ReaderMutexLock mu(self, deoptimized_methods_lock_);
    698       empty = IsDeoptimizedMethodsEmpty();  // Avoid lock violation.
    699     }
    700     if (empty) {
    701       MutexLock mu(self, *Locks::thread_list_lock_);
    702       Runtime::Current()->GetThreadList()->ForEach(InstrumentationRestoreStack, this);
    703       // Only do this after restoring, as walking the stack when restoring will see
    704       // the instrumentation exit pc.
    705       instrumentation_stubs_installed_ = false;
    706     }
    707   }
    708 }
    709 
    710 static void ResetQuickAllocEntryPointsForThread(Thread* thread, void* arg ATTRIBUTE_UNUSED) {
    711   thread->ResetQuickAllocEntryPointsForThread(kUseReadBarrier && thread->GetIsGcMarking());
    712 }
    713 
    714 void Instrumentation::SetEntrypointsInstrumented(bool instrumented) {
    715   Thread* self = Thread::Current();
    716   Runtime* runtime = Runtime::Current();
    717   Locks::mutator_lock_->AssertNotHeld(self);
    718   Locks::instrument_entrypoints_lock_->AssertHeld(self);
    719   if (runtime->IsStarted()) {
    720     ScopedSuspendAll ssa(__FUNCTION__);
    721     MutexLock mu(self, *Locks::runtime_shutdown_lock_);
    722     SetQuickAllocEntryPointsInstrumented(instrumented);
    723     ResetQuickAllocEntryPoints();
    724     alloc_entrypoints_instrumented_ = instrumented;
    725   } else {
    726     MutexLock mu(self, *Locks::runtime_shutdown_lock_);
    727     SetQuickAllocEntryPointsInstrumented(instrumented);
    728 
    729     // Note: ResetQuickAllocEntryPoints only works when the runtime is started. Manually run the
    730     //       update for just this thread.
    731     // Note: self may be null. One of those paths is setting instrumentation in the Heap
    732     //       constructor for gcstress mode.
    733     if (self != nullptr) {
    734       ResetQuickAllocEntryPointsForThread(self, nullptr);
    735     }
    736 
    737     alloc_entrypoints_instrumented_ = instrumented;
    738   }
    739 }
    740 
    741 void Instrumentation::InstrumentQuickAllocEntryPoints() {
    742   MutexLock mu(Thread::Current(), *Locks::instrument_entrypoints_lock_);
    743   InstrumentQuickAllocEntryPointsLocked();
    744 }
    745 
    746 void Instrumentation::UninstrumentQuickAllocEntryPoints() {
    747   MutexLock mu(Thread::Current(), *Locks::instrument_entrypoints_lock_);
    748   UninstrumentQuickAllocEntryPointsLocked();
    749 }
    750 
    751 void Instrumentation::InstrumentQuickAllocEntryPointsLocked() {
    752   Locks::instrument_entrypoints_lock_->AssertHeld(Thread::Current());
    753   if (quick_alloc_entry_points_instrumentation_counter_ == 0) {
    754     SetEntrypointsInstrumented(true);
    755   }
    756   ++quick_alloc_entry_points_instrumentation_counter_;
    757 }
    758 
    759 void Instrumentation::UninstrumentQuickAllocEntryPointsLocked() {
    760   Locks::instrument_entrypoints_lock_->AssertHeld(Thread::Current());
    761   CHECK_GT(quick_alloc_entry_points_instrumentation_counter_, 0U);
    762   --quick_alloc_entry_points_instrumentation_counter_;
    763   if (quick_alloc_entry_points_instrumentation_counter_ == 0) {
    764     SetEntrypointsInstrumented(false);
    765   }
    766 }
    767 
    768 void Instrumentation::ResetQuickAllocEntryPoints() {
    769   Runtime* runtime = Runtime::Current();
    770   if (runtime->IsStarted()) {
    771     MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
    772     runtime->GetThreadList()->ForEach(ResetQuickAllocEntryPointsForThread, nullptr);
    773   }
    774 }
    775 
    776 void Instrumentation::UpdateMethodsCodeImpl(ArtMethod* method, const void* quick_code) {
    777   const void* new_quick_code;
    778   if (LIKELY(!instrumentation_stubs_installed_)) {
    779     new_quick_code = quick_code;
    780   } else {
    781     if ((interpreter_stubs_installed_ || IsDeoptimized(method)) && !method->IsNative()) {
    782       new_quick_code = GetQuickToInterpreterBridge();
    783     } else {
    784       ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    785       if (class_linker->IsQuickResolutionStub(quick_code) ||
    786           class_linker->IsQuickToInterpreterBridge(quick_code)) {
    787         new_quick_code = quick_code;
    788       } else if (entry_exit_stubs_installed_) {
    789         new_quick_code = GetQuickInstrumentationEntryPoint();
    790       } else {
    791         new_quick_code = quick_code;
    792       }
    793     }
    794   }
    795   UpdateEntrypoints(method, new_quick_code);
    796 }
    797 
    798 void Instrumentation::UpdateNativeMethodsCodeToJitCode(ArtMethod* method, const void* quick_code) {
    799   // We don't do any read barrier on `method`'s declaring class in this code, as the JIT might
    800   // enter here on a soon-to-be deleted ArtMethod. Updating the entrypoint is OK though, as
    801   // the ArtMethod is still in memory.
    802   const void* new_quick_code = quick_code;
    803   if (UNLIKELY(instrumentation_stubs_installed_) && entry_exit_stubs_installed_) {
    804     new_quick_code = GetQuickInstrumentationEntryPoint();
    805   }
    806   UpdateEntrypoints(method, new_quick_code);
    807 }
    808 
    809 void Instrumentation::UpdateMethodsCode(ArtMethod* method, const void* quick_code) {
    810   DCHECK(method->GetDeclaringClass()->IsResolved());
    811   UpdateMethodsCodeImpl(method, quick_code);
    812 }
    813 
    814 void Instrumentation::UpdateMethodsCodeToInterpreterEntryPoint(ArtMethod* method) {
    815   UpdateMethodsCodeImpl(method, GetQuickToInterpreterBridge());
    816 }
    817 
    818 void Instrumentation::UpdateMethodsCodeForJavaDebuggable(ArtMethod* method,
    819                                                          const void* quick_code) {
    820   // When the runtime is set to Java debuggable, we may update the entry points of
    821   // all methods of a class to the interpreter bridge. A method's declaring class
    822   // might not be in resolved state yet in that case, so we bypass the DCHECK in
    823   // UpdateMethodsCode.
    824   UpdateMethodsCodeImpl(method, quick_code);
    825 }
    826 
    827 bool Instrumentation::AddDeoptimizedMethod(ArtMethod* method) {
    828   if (IsDeoptimizedMethod(method)) {
    829     // Already in the map. Return.
    830     return false;
    831   }
    832   // Not found. Add it.
    833   deoptimized_methods_.insert(method);
    834   return true;
    835 }
    836 
    837 bool Instrumentation::IsDeoptimizedMethod(ArtMethod* method) {
    838   return deoptimized_methods_.find(method) != deoptimized_methods_.end();
    839 }
    840 
    841 ArtMethod* Instrumentation::BeginDeoptimizedMethod() {
    842   if (deoptimized_methods_.empty()) {
    843     // Empty.
    844     return nullptr;
    845   }
    846   return *deoptimized_methods_.begin();
    847 }
    848 
    849 bool Instrumentation::RemoveDeoptimizedMethod(ArtMethod* method) {
    850   auto it = deoptimized_methods_.find(method);
    851   if (it == deoptimized_methods_.end()) {
    852     return false;
    853   }
    854   deoptimized_methods_.erase(it);
    855   return true;
    856 }
    857 
    858 bool Instrumentation::IsDeoptimizedMethodsEmpty() const {
    859   return deoptimized_methods_.empty();
    860 }
    861 
    862 void Instrumentation::Deoptimize(ArtMethod* method) {
    863   CHECK(!method->IsNative());
    864   CHECK(!method->IsProxyMethod());
    865   CHECK(method->IsInvokable());
    866 
    867   Thread* self = Thread::Current();
    868   {
    869     WriterMutexLock mu(self, deoptimized_methods_lock_);
    870     bool has_not_been_deoptimized = AddDeoptimizedMethod(method);
    871     CHECK(has_not_been_deoptimized) << "Method " << ArtMethod::PrettyMethod(method)
    872         << " is already deoptimized";
    873   }
    874   if (!interpreter_stubs_installed_) {
    875     UpdateEntrypoints(method, GetQuickInstrumentationEntryPoint());
    876 
    877     // Install instrumentation exit stub and instrumentation frames. We may already have installed
    878     // these previously so it will only cover the newly created frames.
    879     instrumentation_stubs_installed_ = true;
    880     MutexLock mu(self, *Locks::thread_list_lock_);
    881     Runtime::Current()->GetThreadList()->ForEach(InstrumentationInstallStack, this);
    882   }
    883 }
    884 
    885 void Instrumentation::Undeoptimize(ArtMethod* method) {
    886   CHECK(!method->IsNative());
    887   CHECK(!method->IsProxyMethod());
    888   CHECK(method->IsInvokable());
    889 
    890   Thread* self = Thread::Current();
    891   bool empty;
    892   {
    893     WriterMutexLock mu(self, deoptimized_methods_lock_);
    894     bool found_and_erased = RemoveDeoptimizedMethod(method);
    895     CHECK(found_and_erased) << "Method " << ArtMethod::PrettyMethod(method)
    896         << " is not deoptimized";
    897     empty = IsDeoptimizedMethodsEmpty();
    898   }
    899 
    900   // Restore code and possibly stack only if we did not deoptimize everything.
    901   if (!interpreter_stubs_installed_) {
    902     // Restore its code or resolution trampoline.
    903     ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    904     if (method->IsStatic() && !method->IsConstructor() &&
    905         !method->GetDeclaringClass()->IsInitialized()) {
    906       UpdateEntrypoints(method, GetQuickResolutionStub());
    907     } else {
    908       const void* quick_code = NeedDebugVersionFor(method)
    909           ? GetQuickToInterpreterBridge()
    910           : class_linker->GetQuickOatCodeFor(method);
    911       UpdateEntrypoints(method, quick_code);
    912     }
    913 
    914     // If there is no deoptimized method left, we can restore the stack of each thread.
    915     if (empty) {
    916       MutexLock mu(self, *Locks::thread_list_lock_);
    917       Runtime::Current()->GetThreadList()->ForEach(InstrumentationRestoreStack, this);
    918       instrumentation_stubs_installed_ = false;
    919     }
    920   }
    921 }
    922 
    923 bool Instrumentation::IsDeoptimized(ArtMethod* method) {
    924   DCHECK(method != nullptr);
    925   ReaderMutexLock mu(Thread::Current(), deoptimized_methods_lock_);
    926   return IsDeoptimizedMethod(method);
    927 }
    928 
    929 void Instrumentation::EnableDeoptimization() {
    930   ReaderMutexLock mu(Thread::Current(), deoptimized_methods_lock_);
    931   CHECK(IsDeoptimizedMethodsEmpty());
    932   CHECK_EQ(deoptimization_enabled_, false);
    933   deoptimization_enabled_ = true;
    934 }
    935 
    936 void Instrumentation::DisableDeoptimization(const char* key) {
    937   CHECK_EQ(deoptimization_enabled_, true);
    938   // If we deoptimized everything, undo it.
    939   InstrumentationLevel level = GetCurrentInstrumentationLevel();
    940   if (level == InstrumentationLevel::kInstrumentWithInterpreter) {
    941     UndeoptimizeEverything(key);
    942   }
    943   // Undeoptimized selected methods.
    944   while (true) {
    945     ArtMethod* method;
    946     {
    947       ReaderMutexLock mu(Thread::Current(), deoptimized_methods_lock_);
    948       if (IsDeoptimizedMethodsEmpty()) {
    949         break;
    950       }
    951       method = BeginDeoptimizedMethod();
    952       CHECK(method != nullptr);
    953     }
    954     Undeoptimize(method);
    955   }
    956   deoptimization_enabled_ = false;
    957 }
    958 
    959 // Indicates if instrumentation should notify method enter/exit events to the listeners.
    960 bool Instrumentation::ShouldNotifyMethodEnterExitEvents() const {
    961   if (!HasMethodEntryListeners() && !HasMethodExitListeners()) {
    962     return false;
    963   }
    964   return !deoptimization_enabled_ && !interpreter_stubs_installed_;
    965 }
    966 
    967 void Instrumentation::DeoptimizeEverything(const char* key) {
    968   CHECK(deoptimization_enabled_);
    969   ConfigureStubs(key, InstrumentationLevel::kInstrumentWithInterpreter);
    970 }
    971 
    972 void Instrumentation::UndeoptimizeEverything(const char* key) {
    973   CHECK(interpreter_stubs_installed_);
    974   CHECK(deoptimization_enabled_);
    975   ConfigureStubs(key, InstrumentationLevel::kInstrumentNothing);
    976 }
    977 
    978 void Instrumentation::EnableMethodTracing(const char* key, bool needs_interpreter) {
    979   InstrumentationLevel level;
    980   if (needs_interpreter) {
    981     level = InstrumentationLevel::kInstrumentWithInterpreter;
    982   } else {
    983     level = InstrumentationLevel::kInstrumentWithInstrumentationStubs;
    984   }
    985   ConfigureStubs(key, level);
    986 }
    987 
    988 void Instrumentation::DisableMethodTracing(const char* key) {
    989   ConfigureStubs(key, InstrumentationLevel::kInstrumentNothing);
    990 }
    991 
    992 const void* Instrumentation::GetQuickCodeFor(ArtMethod* method, PointerSize pointer_size) const {
    993   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    994   if (LIKELY(!instrumentation_stubs_installed_)) {
    995     const void* code = method->GetEntryPointFromQuickCompiledCodePtrSize(pointer_size);
    996     DCHECK(code != nullptr);
    997     if (LIKELY(!class_linker->IsQuickResolutionStub(code) &&
    998                !class_linker->IsQuickToInterpreterBridge(code)) &&
    999                !class_linker->IsQuickResolutionStub(code) &&
   1000                !class_linker->IsQuickToInterpreterBridge(code)) {
   1001       return code;
   1002     }
   1003   }
   1004   return class_linker->GetQuickOatCodeFor(method);
   1005 }
   1006 
   1007 void Instrumentation::MethodEnterEventImpl(Thread* thread,
   1008                                            ObjPtr<mirror::Object> this_object,
   1009                                            ArtMethod* method,
   1010                                            uint32_t dex_pc) const {
   1011   DCHECK(!method->IsRuntimeMethod());
   1012   if (HasMethodEntryListeners()) {
   1013     Thread* self = Thread::Current();
   1014     StackHandleScope<1> hs(self);
   1015     Handle<mirror::Object> thiz(hs.NewHandle(this_object));
   1016     for (InstrumentationListener* listener : method_entry_listeners_) {
   1017       if (listener != nullptr) {
   1018         listener->MethodEntered(thread, thiz, method, dex_pc);
   1019       }
   1020     }
   1021   }
   1022 }
   1023 
   1024 void Instrumentation::MethodExitEventImpl(Thread* thread,
   1025                                           ObjPtr<mirror::Object> this_object,
   1026                                           ArtMethod* method,
   1027                                           uint32_t dex_pc,
   1028                                           const JValue& return_value) const {
   1029   if (HasMethodExitListeners()) {
   1030     Thread* self = Thread::Current();
   1031     StackHandleScope<2> hs(self);
   1032     Handle<mirror::Object> thiz(hs.NewHandle(this_object));
   1033     if (method->GetInterfaceMethodIfProxy(kRuntimePointerSize)
   1034               ->GetReturnTypePrimitive() != Primitive::kPrimNot) {
   1035       for (InstrumentationListener* listener : method_exit_listeners_) {
   1036         if (listener != nullptr) {
   1037           listener->MethodExited(thread, thiz, method, dex_pc, return_value);
   1038         }
   1039       }
   1040     } else {
   1041       Handle<mirror::Object> ret(hs.NewHandle(return_value.GetL()));
   1042       for (InstrumentationListener* listener : method_exit_listeners_) {
   1043         if (listener != nullptr) {
   1044           listener->MethodExited(thread, thiz, method, dex_pc, ret);
   1045         }
   1046       }
   1047     }
   1048   }
   1049 }
   1050 
   1051 void Instrumentation::MethodUnwindEvent(Thread* thread,
   1052                                         mirror::Object* this_object,
   1053                                         ArtMethod* method,
   1054                                         uint32_t dex_pc) const {
   1055   if (HasMethodUnwindListeners()) {
   1056     Thread* self = Thread::Current();
   1057     StackHandleScope<1> hs(self);
   1058     Handle<mirror::Object> thiz(hs.NewHandle(this_object));
   1059     for (InstrumentationListener* listener : method_unwind_listeners_) {
   1060       if (listener != nullptr) {
   1061         listener->MethodUnwind(thread, thiz, method, dex_pc);
   1062       }
   1063     }
   1064   }
   1065 }
   1066 
   1067 void Instrumentation::DexPcMovedEventImpl(Thread* thread,
   1068                                           ObjPtr<mirror::Object> this_object,
   1069                                           ArtMethod* method,
   1070                                           uint32_t dex_pc) const {
   1071   Thread* self = Thread::Current();
   1072   StackHandleScope<1> hs(self);
   1073   Handle<mirror::Object> thiz(hs.NewHandle(this_object));
   1074   for (InstrumentationListener* listener : dex_pc_listeners_) {
   1075     if (listener != nullptr) {
   1076       listener->DexPcMoved(thread, thiz, method, dex_pc);
   1077     }
   1078   }
   1079 }
   1080 
   1081 void Instrumentation::BranchImpl(Thread* thread,
   1082                                  ArtMethod* method,
   1083                                  uint32_t dex_pc,
   1084                                  int32_t offset) const {
   1085   for (InstrumentationListener* listener : branch_listeners_) {
   1086     if (listener != nullptr) {
   1087       listener->Branch(thread, method, dex_pc, offset);
   1088     }
   1089   }
   1090 }
   1091 
   1092 void Instrumentation::InvokeVirtualOrInterfaceImpl(Thread* thread,
   1093                                                    ObjPtr<mirror::Object> this_object,
   1094                                                    ArtMethod* caller,
   1095                                                    uint32_t dex_pc,
   1096                                                    ArtMethod* callee) const {
   1097   Thread* self = Thread::Current();
   1098   StackHandleScope<1> hs(self);
   1099   Handle<mirror::Object> thiz(hs.NewHandle(this_object));
   1100   for (InstrumentationListener* listener : invoke_virtual_or_interface_listeners_) {
   1101     if (listener != nullptr) {
   1102       listener->InvokeVirtualOrInterface(thread, thiz, caller, dex_pc, callee);
   1103     }
   1104   }
   1105 }
   1106 
   1107 void Instrumentation::WatchedFramePopImpl(Thread* thread, const ShadowFrame& frame) const {
   1108   for (InstrumentationListener* listener : watched_frame_pop_listeners_) {
   1109     if (listener != nullptr) {
   1110       listener->WatchedFramePop(thread, frame);
   1111     }
   1112   }
   1113 }
   1114 
   1115 void Instrumentation::FieldReadEventImpl(Thread* thread,
   1116                                          ObjPtr<mirror::Object> this_object,
   1117                                          ArtMethod* method,
   1118                                          uint32_t dex_pc,
   1119                                          ArtField* field) const {
   1120   Thread* self = Thread::Current();
   1121   StackHandleScope<1> hs(self);
   1122   Handle<mirror::Object> thiz(hs.NewHandle(this_object));
   1123   for (InstrumentationListener* listener : field_read_listeners_) {
   1124     if (listener != nullptr) {
   1125       listener->FieldRead(thread, thiz, method, dex_pc, field);
   1126     }
   1127   }
   1128 }
   1129 
   1130 void Instrumentation::FieldWriteEventImpl(Thread* thread,
   1131                                           ObjPtr<mirror::Object> this_object,
   1132                                           ArtMethod* method,
   1133                                           uint32_t dex_pc,
   1134                                           ArtField* field,
   1135                                           const JValue& field_value) const {
   1136   Thread* self = Thread::Current();
   1137   StackHandleScope<2> hs(self);
   1138   Handle<mirror::Object> thiz(hs.NewHandle(this_object));
   1139   if (field->IsPrimitiveType()) {
   1140     for (InstrumentationListener* listener : field_write_listeners_) {
   1141       if (listener != nullptr) {
   1142         listener->FieldWritten(thread, thiz, method, dex_pc, field, field_value);
   1143       }
   1144     }
   1145   } else {
   1146     Handle<mirror::Object> val(hs.NewHandle(field_value.GetL()));
   1147     for (InstrumentationListener* listener : field_write_listeners_) {
   1148       if (listener != nullptr) {
   1149         listener->FieldWritten(thread, thiz, method, dex_pc, field, val);
   1150       }
   1151     }
   1152   }
   1153 }
   1154 
   1155 void Instrumentation::ExceptionThrownEvent(Thread* thread,
   1156                                            mirror::Throwable* exception_object) const {
   1157   Thread* self = Thread::Current();
   1158   StackHandleScope<1> hs(self);
   1159   Handle<mirror::Throwable> h_exception(hs.NewHandle(exception_object));
   1160   if (HasExceptionThrownListeners()) {
   1161     DCHECK_EQ(thread->GetException(), h_exception.Get());
   1162     thread->ClearException();
   1163     for (InstrumentationListener* listener : exception_thrown_listeners_) {
   1164       if (listener != nullptr) {
   1165         listener->ExceptionThrown(thread, h_exception);
   1166       }
   1167     }
   1168     // See b/65049545 for discussion about this behavior.
   1169     thread->AssertNoPendingException();
   1170     thread->SetException(h_exception.Get());
   1171   }
   1172 }
   1173 
   1174 void Instrumentation::ExceptionHandledEvent(Thread* thread,
   1175                                             mirror::Throwable* exception_object) const {
   1176   Thread* self = Thread::Current();
   1177   StackHandleScope<1> hs(self);
   1178   Handle<mirror::Throwable> h_exception(hs.NewHandle(exception_object));
   1179   if (HasExceptionHandledListeners()) {
   1180     // We should have cleared the exception so that callers can detect a new one.
   1181     DCHECK(thread->GetException() == nullptr);
   1182     for (InstrumentationListener* listener : exception_handled_listeners_) {
   1183       if (listener != nullptr) {
   1184         listener->ExceptionHandled(thread, h_exception);
   1185       }
   1186     }
   1187   }
   1188 }
   1189 
   1190 // Computes a frame ID by ignoring inlined frames.
   1191 size_t Instrumentation::ComputeFrameId(Thread* self,
   1192                                        size_t frame_depth,
   1193                                        size_t inlined_frames_before_frame) {
   1194   CHECK_GE(frame_depth, inlined_frames_before_frame);
   1195   size_t no_inline_depth = frame_depth - inlined_frames_before_frame;
   1196   return StackVisitor::ComputeNumFrames(self, kInstrumentationStackWalk) - no_inline_depth;
   1197 }
   1198 
   1199 static void CheckStackDepth(Thread* self, const InstrumentationStackFrame& instrumentation_frame,
   1200                             int delta)
   1201     REQUIRES_SHARED(Locks::mutator_lock_) {
   1202   size_t frame_id = StackVisitor::ComputeNumFrames(self, kInstrumentationStackWalk) + delta;
   1203   if (frame_id != instrumentation_frame.frame_id_) {
   1204     LOG(ERROR) << "Expected frame_id=" << frame_id << " but found "
   1205         << instrumentation_frame.frame_id_;
   1206     StackVisitor::DescribeStack(self);
   1207     CHECK_EQ(frame_id, instrumentation_frame.frame_id_);
   1208   }
   1209 }
   1210 
   1211 void Instrumentation::PushInstrumentationStackFrame(Thread* self, mirror::Object* this_object,
   1212                                                     ArtMethod* method,
   1213                                                     uintptr_t lr, bool interpreter_entry) {
   1214   DCHECK(!self->IsExceptionPending());
   1215   std::deque<instrumentation::InstrumentationStackFrame>* stack = self->GetInstrumentationStack();
   1216   if (kVerboseInstrumentation) {
   1217     LOG(INFO) << "Entering " << ArtMethod::PrettyMethod(method) << " from PC "
   1218               << reinterpret_cast<void*>(lr);
   1219   }
   1220 
   1221   // We send the enter event before pushing the instrumentation frame to make cleanup easier. If the
   1222   // event causes an exception we can simply send the unwind event and return.
   1223   StackHandleScope<1> hs(self);
   1224   Handle<mirror::Object> h_this(hs.NewHandle(this_object));
   1225   if (!interpreter_entry) {
   1226     MethodEnterEvent(self, h_this.Get(), method, 0);
   1227     if (self->IsExceptionPending()) {
   1228       MethodUnwindEvent(self, h_this.Get(), method, 0);
   1229       return;
   1230     }
   1231   }
   1232 
   1233   // We have a callee-save frame meaning this value is guaranteed to never be 0.
   1234   DCHECK(!self->IsExceptionPending());
   1235   size_t frame_id = StackVisitor::ComputeNumFrames(self, kInstrumentationStackWalk);
   1236 
   1237   instrumentation::InstrumentationStackFrame instrumentation_frame(h_this.Get(), method, lr,
   1238                                                                    frame_id, interpreter_entry);
   1239   stack->push_front(instrumentation_frame);
   1240 }
   1241 
   1242 DeoptimizationMethodType Instrumentation::GetDeoptimizationMethodType(ArtMethod* method) {
   1243   if (method->IsRuntimeMethod()) {
   1244     // Certain methods have strict requirement on whether the dex instruction
   1245     // should be re-executed upon deoptimization.
   1246     if (method == Runtime::Current()->GetCalleeSaveMethod(
   1247         CalleeSaveType::kSaveEverythingForClinit)) {
   1248       return DeoptimizationMethodType::kKeepDexPc;
   1249     }
   1250     if (method == Runtime::Current()->GetCalleeSaveMethod(
   1251         CalleeSaveType::kSaveEverythingForSuspendCheck)) {
   1252       return DeoptimizationMethodType::kKeepDexPc;
   1253     }
   1254   }
   1255   return DeoptimizationMethodType::kDefault;
   1256 }
   1257 
   1258 // Try to get the shorty of a runtime method if it's an invocation stub.
   1259 struct RuntimeMethodShortyVisitor : public StackVisitor {
   1260   explicit RuntimeMethodShortyVisitor(Thread* thread)
   1261       : StackVisitor(thread, nullptr, StackVisitor::StackWalkKind::kIncludeInlinedFrames),
   1262         shorty('V') {}
   1263 
   1264   bool VisitFrame() REQUIRES_SHARED(Locks::mutator_lock_) {
   1265     ArtMethod* m = GetMethod();
   1266     if (m != nullptr && !m->IsRuntimeMethod()) {
   1267       // The first Java method.
   1268       if (m->IsNative()) {
   1269         // Use JNI method's shorty for the jni stub.
   1270         shorty = m->GetShorty()[0];
   1271         return false;
   1272       }
   1273       if (m->IsProxyMethod()) {
   1274         // Proxy method just invokes its proxied method via
   1275         // art_quick_proxy_invoke_handler.
   1276         shorty = m->GetInterfaceMethodIfProxy(kRuntimePointerSize)->GetShorty()[0];
   1277         return false;
   1278       }
   1279       const Instruction& instr = m->DexInstructions().InstructionAt(GetDexPc());
   1280       if (instr.IsInvoke()) {
   1281         const DexFile* dex_file = m->GetDexFile();
   1282         if (interpreter::IsStringInit(dex_file, instr.VRegB())) {
   1283           // Invoking string init constructor is turned into invoking
   1284           // StringFactory.newStringFromChars() which returns a string.
   1285           shorty = 'L';
   1286           return false;
   1287         }
   1288         // A regular invoke, use callee's shorty.
   1289         uint32_t method_idx = instr.VRegB();
   1290         shorty = dex_file->GetMethodShorty(method_idx)[0];
   1291       }
   1292       // Stop stack walking since we've seen a Java frame.
   1293       return false;
   1294     }
   1295     return true;
   1296   }
   1297 
   1298   char shorty;
   1299 };
   1300 
   1301 TwoWordReturn Instrumentation::PopInstrumentationStackFrame(Thread* self,
   1302                                                             uintptr_t* return_pc,
   1303                                                             uint64_t* gpr_result,
   1304                                                             uint64_t* fpr_result) {
   1305   DCHECK(gpr_result != nullptr);
   1306   DCHECK(fpr_result != nullptr);
   1307   // Do the pop.
   1308   std::deque<instrumentation::InstrumentationStackFrame>* stack = self->GetInstrumentationStack();
   1309   CHECK_GT(stack->size(), 0U);
   1310   InstrumentationStackFrame instrumentation_frame = stack->front();
   1311   stack->pop_front();
   1312 
   1313   // Set return PC and check the sanity of the stack.
   1314   *return_pc = instrumentation_frame.return_pc_;
   1315   CheckStackDepth(self, instrumentation_frame, 0);
   1316   self->VerifyStack();
   1317 
   1318   ArtMethod* method = instrumentation_frame.method_;
   1319   uint32_t length;
   1320   const PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
   1321   char return_shorty;
   1322 
   1323   // Runtime method does not call into MethodExitEvent() so there should not be
   1324   // suspension point below.
   1325   ScopedAssertNoThreadSuspension ants(__FUNCTION__, method->IsRuntimeMethod());
   1326   if (method->IsRuntimeMethod()) {
   1327     if (method != Runtime::Current()->GetCalleeSaveMethod(
   1328         CalleeSaveType::kSaveEverythingForClinit)) {
   1329       // If the caller is at an invocation point and the runtime method is not
   1330       // for clinit, we need to pass return results to the caller.
   1331       // We need the correct shorty to decide whether we need to pass the return
   1332       // result for deoptimization below.
   1333       RuntimeMethodShortyVisitor visitor(self);
   1334       visitor.WalkStack();
   1335       return_shorty = visitor.shorty;
   1336     } else {
   1337       // Some runtime methods such as allocations, unresolved field getters, etc.
   1338       // have return value. We don't need to set return_value since MethodExitEvent()
   1339       // below isn't called for runtime methods. Deoptimization doesn't need the
   1340       // value either since the dex instruction will be re-executed by the
   1341       // interpreter, except these two cases:
   1342       // (1) For an invoke, which is handled above to get the correct shorty.
   1343       // (2) For MONITOR_ENTER/EXIT, which cannot be re-executed since it's not
   1344       //     idempotent. However there is no return value for it anyway.
   1345       return_shorty = 'V';
   1346     }
   1347   } else {
   1348     return_shorty = method->GetInterfaceMethodIfProxy(pointer_size)->GetShorty(&length)[0];
   1349   }
   1350 
   1351   bool is_ref = return_shorty == '[' || return_shorty == 'L';
   1352   StackHandleScope<1> hs(self);
   1353   MutableHandle<mirror::Object> res(hs.NewHandle<mirror::Object>(nullptr));
   1354   JValue return_value;
   1355   if (return_shorty == 'V') {
   1356     return_value.SetJ(0);
   1357   } else if (return_shorty == 'F' || return_shorty == 'D') {
   1358     return_value.SetJ(*fpr_result);
   1359   } else {
   1360     return_value.SetJ(*gpr_result);
   1361   }
   1362   if (is_ref) {
   1363     // Take a handle to the return value so we won't lose it if we suspend.
   1364     res.Assign(return_value.GetL());
   1365   }
   1366   // TODO: improve the dex pc information here, requires knowledge of current PC as opposed to
   1367   //       return_pc.
   1368   uint32_t dex_pc = dex::kDexNoIndex;
   1369   mirror::Object* this_object = instrumentation_frame.this_object_;
   1370   if (!method->IsRuntimeMethod() && !instrumentation_frame.interpreter_entry_) {
   1371     MethodExitEvent(self, this_object, instrumentation_frame.method_, dex_pc, return_value);
   1372   }
   1373 
   1374   // Deoptimize if the caller needs to continue execution in the interpreter. Do nothing if we get
   1375   // back to an upcall.
   1376   NthCallerVisitor visitor(self, 1, true);
   1377   visitor.WalkStack(true);
   1378   bool deoptimize = (visitor.caller != nullptr) &&
   1379                     (interpreter_stubs_installed_ || IsDeoptimized(visitor.caller) ||
   1380                     Dbg::IsForcedInterpreterNeededForUpcall(self, visitor.caller));
   1381   if (is_ref) {
   1382     // Restore the return value if it's a reference since it might have moved.
   1383     *reinterpret_cast<mirror::Object**>(gpr_result) = res.Get();
   1384   }
   1385   if (deoptimize && Runtime::Current()->IsAsyncDeoptimizeable(*return_pc)) {
   1386     if (kVerboseInstrumentation) {
   1387       LOG(INFO) << "Deoptimizing "
   1388                 << visitor.caller->PrettyMethod()
   1389                 << " by returning from "
   1390                 << method->PrettyMethod()
   1391                 << " with result "
   1392                 << std::hex << return_value.GetJ() << std::dec
   1393                 << " in "
   1394                 << *self;
   1395     }
   1396     DeoptimizationMethodType deopt_method_type = GetDeoptimizationMethodType(method);
   1397     self->PushDeoptimizationContext(return_value,
   1398                                     return_shorty == 'L' || return_shorty == '[',
   1399                                     nullptr /* no pending exception */,
   1400                                     false /* from_code */,
   1401                                     deopt_method_type);
   1402     return GetTwoWordSuccessValue(*return_pc,
   1403                                   reinterpret_cast<uintptr_t>(GetQuickDeoptimizationEntryPoint()));
   1404   } else {
   1405     if (deoptimize && !Runtime::Current()->IsAsyncDeoptimizeable(*return_pc)) {
   1406       VLOG(deopt) << "Got a deoptimization request on un-deoptimizable " << method->PrettyMethod()
   1407                   << " at PC " << reinterpret_cast<void*>(*return_pc);
   1408     }
   1409     if (kVerboseInstrumentation) {
   1410       LOG(INFO) << "Returning from " << method->PrettyMethod()
   1411                 << " to PC " << reinterpret_cast<void*>(*return_pc);
   1412     }
   1413     return GetTwoWordSuccessValue(0, *return_pc);
   1414   }
   1415 }
   1416 
   1417 uintptr_t Instrumentation::PopMethodForUnwind(Thread* self, bool is_deoptimization) const {
   1418   // Do the pop.
   1419   std::deque<instrumentation::InstrumentationStackFrame>* stack = self->GetInstrumentationStack();
   1420   CHECK_GT(stack->size(), 0U);
   1421   size_t idx = stack->size();
   1422   InstrumentationStackFrame instrumentation_frame = stack->front();
   1423 
   1424   ArtMethod* method = instrumentation_frame.method_;
   1425   if (is_deoptimization) {
   1426     if (kVerboseInstrumentation) {
   1427       LOG(INFO) << "Popping for deoptimization " << ArtMethod::PrettyMethod(method);
   1428     }
   1429   } else {
   1430     if (kVerboseInstrumentation) {
   1431       LOG(INFO) << "Popping for unwind " << ArtMethod::PrettyMethod(method);
   1432     }
   1433 
   1434     // Notify listeners of method unwind.
   1435     // TODO: improve the dex pc information here, requires knowledge of current PC as opposed to
   1436     //       return_pc.
   1437     uint32_t dex_pc = dex::kDexNoIndex;
   1438     if (!method->IsRuntimeMethod()) {
   1439       MethodUnwindEvent(self, instrumentation_frame.this_object_, method, dex_pc);
   1440     }
   1441   }
   1442   // TODO: bring back CheckStackDepth(self, instrumentation_frame, 2);
   1443   CHECK_EQ(stack->size(), idx);
   1444   DCHECK(instrumentation_frame.method_ == stack->front().method_);
   1445   stack->pop_front();
   1446   return instrumentation_frame.return_pc_;
   1447 }
   1448 
   1449 std::string InstrumentationStackFrame::Dump() const {
   1450   std::ostringstream os;
   1451   os << "Frame " << frame_id_ << " " << ArtMethod::PrettyMethod(method_) << ":"
   1452       << reinterpret_cast<void*>(return_pc_) << " this=" << reinterpret_cast<void*>(this_object_);
   1453   return os.str();
   1454 }
   1455 
   1456 }  // namespace instrumentation
   1457 }  // namespace art
   1458