diff options
Diffstat (limited to 'runtime/instrumentation.cc')
| -rw-r--r-- | runtime/instrumentation.cc | 112 |
1 files changed, 38 insertions, 74 deletions
diff --git a/runtime/instrumentation.cc b/runtime/instrumentation.cc index 98e6200bcb..4ced23d488 100644 --- a/runtime/instrumentation.cc +++ b/runtime/instrumentation.cc @@ -19,6 +19,7 @@ #include <sstream> #include "arch/context.h" +#include "art_method-inl.h" #include "atomic.h" #include "class_linker.h" #include "debugger.h" @@ -30,7 +31,6 @@ #include "interpreter/interpreter.h" #include "jit/jit.h" #include "jit/jit_code_cache.h" -#include "mirror/art_method-inl.h" #include "mirror/class-inl.h" #include "mirror/dex_cache.h" #include "mirror/object_array-inl.h" @@ -78,15 +78,15 @@ void Instrumentation::InstallStubsForClass(mirror::Class* klass) { // could not be initialized or linked with regards to class inheritance. } else { for (size_t i = 0, e = klass->NumDirectMethods(); i < e; i++) { - InstallStubsForMethod(klass->GetDirectMethod(i)); + InstallStubsForMethod(klass->GetDirectMethod(i, sizeof(void*))); } for (size_t i = 0, e = klass->NumVirtualMethods(); i < e; i++) { - InstallStubsForMethod(klass->GetVirtualMethod(i)); + InstallStubsForMethod(klass->GetVirtualMethod(i, sizeof(void*))); } } } -static void UpdateEntrypoints(mirror::ArtMethod* method, const void* quick_code) +static void UpdateEntrypoints(ArtMethod* method, const void* quick_code) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { Runtime* const runtime = Runtime::Current(); jit::Jit* jit = runtime->GetJit(); @@ -114,7 +114,7 @@ static void UpdateEntrypoints(mirror::ArtMethod* method, const void* quick_code) } } -void Instrumentation::InstallStubsForMethod(mirror::ArtMethod* method) { +void Instrumentation::InstallStubsForMethod(ArtMethod* method) { if (method->IsAbstract() || method->IsProxyMethod()) { // Do not change stubs for these methods. return; @@ -175,7 +175,7 @@ static void InstrumentationInstallStack(Thread* thread, void* arg) } bool VisitFrame() OVERRIDE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - mirror::ArtMethod* m = GetMethod(); + ArtMethod* m = GetMethod(); if (m == nullptr) { if (kVerboseInstrumentation) { LOG(INFO) << " Skipping upcall. Frame " << GetFrameId(); @@ -319,7 +319,7 @@ static void InstrumentationRestoreStack(Thread* thread, void* arg) if (instrumentation_stack_->size() == 0) { return false; // Stop. } - mirror::ArtMethod* m = GetMethod(); + ArtMethod* m = GetMethod(); if (GetCurrentQuickFrame() == nullptr) { if (kVerboseInstrumentation) { LOG(INFO) << " Ignoring a shadow frame. Frame " << GetFrameId() @@ -656,7 +656,7 @@ void Instrumentation::ResetQuickAllocEntryPoints() { } } -void Instrumentation::UpdateMethodsCode(mirror::ArtMethod* method, const void* quick_code) { +void Instrumentation::UpdateMethodsCode(ArtMethod* method, const void* quick_code) { DCHECK(method->GetDeclaringClass()->IsResolved()); const void* new_quick_code; if (LIKELY(!instrumentation_stubs_installed_)) { @@ -679,67 +679,42 @@ void Instrumentation::UpdateMethodsCode(mirror::ArtMethod* method, const void* q UpdateEntrypoints(method, new_quick_code); } -bool Instrumentation::AddDeoptimizedMethod(mirror::ArtMethod* method) { - // Note that the insert() below isn't read barrier-aware. So, this - // FindDeoptimizedMethod() call is necessary or else we would end up - // storing the same method twice in the map (the from-space and the - // to-space ones). - if (FindDeoptimizedMethod(method)) { +bool Instrumentation::AddDeoptimizedMethod(ArtMethod* method) { + if (IsDeoptimizedMethod(method)) { // Already in the map. Return. return false; } // Not found. Add it. - static_assert(!kMovingMethods, "Not safe if methods can move"); - int32_t hash_code = method->IdentityHashCode(); - deoptimized_methods_.insert(std::make_pair(hash_code, GcRoot<mirror::ArtMethod>(method))); + deoptimized_methods_.insert(method); return true; } -bool Instrumentation::FindDeoptimizedMethod(mirror::ArtMethod* method) { - static_assert(!kMovingMethods, "Not safe if methods can move"); - int32_t hash_code = method->IdentityHashCode(); - auto range = deoptimized_methods_.equal_range(hash_code); - for (auto it = range.first; it != range.second; ++it) { - mirror::ArtMethod* m = it->second.Read(); - if (m == method) { - // Found. - return true; - } - } - // Not found. - return false; +bool Instrumentation::IsDeoptimizedMethod(ArtMethod* method) { + return deoptimized_methods_.find(method) != deoptimized_methods_.end(); } -mirror::ArtMethod* Instrumentation::BeginDeoptimizedMethod() { - auto it = deoptimized_methods_.begin(); - if (it == deoptimized_methods_.end()) { +ArtMethod* Instrumentation::BeginDeoptimizedMethod() { + if (deoptimized_methods_.empty()) { // Empty. return nullptr; } - return it->second.Read(); + return *deoptimized_methods_.begin(); } -bool Instrumentation::RemoveDeoptimizedMethod(mirror::ArtMethod* method) { - static_assert(!kMovingMethods, "Not safe if methods can move"); - int32_t hash_code = method->IdentityHashCode(); - auto range = deoptimized_methods_.equal_range(hash_code); - for (auto it = range.first; it != range.second; ++it) { - mirror::ArtMethod* m = it->second.Read(); - if (m == method) { - // Found. Erase and return. - deoptimized_methods_.erase(it); - return true; - } +bool Instrumentation::RemoveDeoptimizedMethod(ArtMethod* method) { + auto it = deoptimized_methods_.find(method); + if (it == deoptimized_methods_.end()) { + return false; } - // Not found. - return false; + deoptimized_methods_.erase(it); + return true; } bool Instrumentation::IsDeoptimizedMethodsEmpty() const { return deoptimized_methods_.empty(); } -void Instrumentation::Deoptimize(mirror::ArtMethod* method) { +void Instrumentation::Deoptimize(ArtMethod* method) { CHECK(!method->IsNative()); CHECK(!method->IsProxyMethod()); CHECK(!method->IsAbstract()); @@ -762,7 +737,7 @@ void Instrumentation::Deoptimize(mirror::ArtMethod* method) { } } -void Instrumentation::Undeoptimize(mirror::ArtMethod* method) { +void Instrumentation::Undeoptimize(ArtMethod* method) { CHECK(!method->IsNative()); CHECK(!method->IsProxyMethod()); CHECK(!method->IsAbstract()); @@ -798,10 +773,10 @@ void Instrumentation::Undeoptimize(mirror::ArtMethod* method) { } } -bool Instrumentation::IsDeoptimized(mirror::ArtMethod* method) { +bool Instrumentation::IsDeoptimized(ArtMethod* method) { DCHECK(method != nullptr); ReaderMutexLock mu(Thread::Current(), deoptimized_methods_lock_); - return FindDeoptimizedMethod(method); + return IsDeoptimizedMethod(method); } void Instrumentation::EnableDeoptimization() { @@ -819,7 +794,7 @@ void Instrumentation::DisableDeoptimization(const char* key) { } // Undeoptimized selected methods. while (true) { - mirror::ArtMethod* method; + ArtMethod* method; { ReaderMutexLock mu(Thread::Current(), deoptimized_methods_lock_); if (IsDeoptimizedMethodsEmpty()) { @@ -866,7 +841,7 @@ void Instrumentation::DisableMethodTracing(const char* key) { ConfigureStubs(key, InstrumentationLevel::kInstrumentNothing); } -const void* Instrumentation::GetQuickCodeFor(mirror::ArtMethod* method, size_t pointer_size) const { +const void* Instrumentation::GetQuickCodeFor(ArtMethod* method, size_t pointer_size) const { Runtime* runtime = Runtime::Current(); if (LIKELY(!instrumentation_stubs_installed_)) { const void* code = method->GetEntryPointFromQuickCompiledCodePtrSize(pointer_size); @@ -883,7 +858,7 @@ const void* Instrumentation::GetQuickCodeFor(mirror::ArtMethod* method, size_t p } void Instrumentation::MethodEnterEventImpl(Thread* thread, mirror::Object* this_object, - mirror::ArtMethod* method, + ArtMethod* method, uint32_t dex_pc) const { auto it = method_entry_listeners_.begin(); bool is_end = (it == method_entry_listeners_.end()); @@ -897,7 +872,7 @@ void Instrumentation::MethodEnterEventImpl(Thread* thread, mirror::Object* this_ } void Instrumentation::MethodExitEventImpl(Thread* thread, mirror::Object* this_object, - mirror::ArtMethod* method, + ArtMethod* method, uint32_t dex_pc, const JValue& return_value) const { auto it = method_exit_listeners_.begin(); bool is_end = (it == method_exit_listeners_.end()); @@ -911,7 +886,7 @@ void Instrumentation::MethodExitEventImpl(Thread* thread, mirror::Object* this_o } void Instrumentation::MethodUnwindEvent(Thread* thread, mirror::Object* this_object, - mirror::ArtMethod* method, + ArtMethod* method, uint32_t dex_pc) const { if (HasMethodUnwindListeners()) { for (InstrumentationListener* listener : method_unwind_listeners_) { @@ -921,7 +896,7 @@ void Instrumentation::MethodUnwindEvent(Thread* thread, mirror::Object* this_obj } void Instrumentation::DexPcMovedEventImpl(Thread* thread, mirror::Object* this_object, - mirror::ArtMethod* method, + ArtMethod* method, uint32_t dex_pc) const { std::shared_ptr<std::list<InstrumentationListener*>> original(dex_pc_listeners_); for (InstrumentationListener* listener : *original.get()) { @@ -929,7 +904,7 @@ void Instrumentation::DexPcMovedEventImpl(Thread* thread, mirror::Object* this_o } } -void Instrumentation::BackwardBranchImpl(Thread* thread, mirror::ArtMethod* method, +void Instrumentation::BackwardBranchImpl(Thread* thread, ArtMethod* method, int32_t offset) const { for (InstrumentationListener* listener : backward_branch_listeners_) { listener->BackwardBranch(thread, method, offset); @@ -937,7 +912,7 @@ void Instrumentation::BackwardBranchImpl(Thread* thread, mirror::ArtMethod* meth } void Instrumentation::FieldReadEventImpl(Thread* thread, mirror::Object* this_object, - mirror::ArtMethod* method, uint32_t dex_pc, + ArtMethod* method, uint32_t dex_pc, ArtField* field) const { std::shared_ptr<std::list<InstrumentationListener*>> original(field_read_listeners_); for (InstrumentationListener* listener : *original.get()) { @@ -946,7 +921,7 @@ void Instrumentation::FieldReadEventImpl(Thread* thread, mirror::Object* this_ob } void Instrumentation::FieldWriteEventImpl(Thread* thread, mirror::Object* this_object, - mirror::ArtMethod* method, uint32_t dex_pc, + ArtMethod* method, uint32_t dex_pc, ArtField* field, const JValue& field_value) const { std::shared_ptr<std::list<InstrumentationListener*>> original(field_write_listeners_); for (InstrumentationListener* listener : *original.get()) { @@ -980,7 +955,7 @@ static void CheckStackDepth(Thread* self, const InstrumentationStackFrame& instr } void Instrumentation::PushInstrumentationStackFrame(Thread* self, mirror::Object* this_object, - mirror::ArtMethod* method, + ArtMethod* method, uintptr_t lr, bool interpreter_entry) { // We have a callee-save frame meaning this value is guaranteed to never be 0. size_t frame_id = StackVisitor::ComputeNumFrames(self, kInstrumentationStackWalk); @@ -1011,7 +986,7 @@ TwoWordReturn Instrumentation::PopInstrumentationStackFrame(Thread* self, uintpt CheckStackDepth(self, instrumentation_frame, 0); self->VerifyStack(); - mirror::ArtMethod* method = instrumentation_frame.method_; + ArtMethod* method = instrumentation_frame.method_; uint32_t length; char return_shorty = method->GetShorty(&length)[0]; JValue return_value; @@ -1064,7 +1039,7 @@ void Instrumentation::PopMethodForUnwind(Thread* self, bool is_deoptimization) c // TODO: bring back CheckStackDepth(self, instrumentation_frame, 2); stack->pop_front(); - mirror::ArtMethod* method = instrumentation_frame.method_; + ArtMethod* method = instrumentation_frame.method_; if (is_deoptimization) { if (kVerboseInstrumentation) { LOG(INFO) << "Popping for deoptimization " << PrettyMethod(method); @@ -1082,17 +1057,6 @@ void Instrumentation::PopMethodForUnwind(Thread* self, bool is_deoptimization) c } } -void Instrumentation::VisitRoots(RootVisitor* visitor) { - WriterMutexLock mu(Thread::Current(), deoptimized_methods_lock_); - if (IsDeoptimizedMethodsEmpty()) { - return; - } - BufferedRootVisitor<kDefaultBufferedRootCount> roots(visitor, RootInfo(kRootVMInternal)); - for (auto pair : deoptimized_methods_) { - roots.VisitRoot(pair.second); - } -} - std::string InstrumentationStackFrame::Dump() const { std::ostringstream os; os << "Frame " << frame_id_ << " " << PrettyMethod(method_) << ":" |