summaryrefslogtreecommitdiff
path: root/runtime/instrumentation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/instrumentation.cc')
-rw-r--r--runtime/instrumentation.cc112
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_) << ":"