diff options
| -rw-r--r-- | runtime/debugger.cc | 8 | ||||
| -rw-r--r-- | runtime/instrumentation.cc | 24 | ||||
| -rw-r--r-- | runtime/instrumentation.h | 29 | ||||
| -rw-r--r-- | runtime/instrumentation_test.cc | 31 | ||||
| -rw-r--r-- | runtime/interpreter/interpreter_goto_table_impl.cc | 38 | ||||
| -rw-r--r-- | runtime/interpreter/interpreter_switch_impl.cc | 38 | ||||
| -rw-r--r-- | runtime/jit/jit_instrumentation.cc | 13 | ||||
| -rw-r--r-- | runtime/jit/jit_instrumentation.h | 4 | ||||
| -rw-r--r-- | runtime/trace.cc | 6 | ||||
| -rw-r--r-- | runtime/trace.h | 2 |
10 files changed, 101 insertions, 92 deletions
diff --git a/runtime/debugger.cc b/runtime/debugger.cc index 6e11cf88c4..a0f875d6b8 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -230,11 +230,11 @@ class DebugInstrumentationListener FINAL : public instrumentation::Instrumentati Dbg::PostException(exception_object); } - // We only care about how many backward branches were executed in the Jit. - void BackwardBranch(Thread* /*thread*/, ArtMethod* method, int32_t dex_pc_offset) + // We only care about branches in the Jit. + void Branch(Thread* /*thread*/, ArtMethod* method, uint32_t dex_pc, int32_t dex_pc_offset) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) { - LOG(ERROR) << "Unexpected backward branch event in debugger " << PrettyMethod(method) - << " " << dex_pc_offset; + LOG(ERROR) << "Unexpected branch event in debugger " << PrettyMethod(method) + << " " << dex_pc << ", " << dex_pc_offset; } // We only care about invokes in the Jit. diff --git a/runtime/instrumentation.cc b/runtime/instrumentation.cc index 7d55e8c20a..c57b1bbf2d 100644 --- a/runtime/instrumentation.cc +++ b/runtime/instrumentation.cc @@ -78,7 +78,7 @@ Instrumentation::Instrumentation() have_field_read_listeners_(false), have_field_write_listeners_(false), have_exception_caught_listeners_(false), - have_backward_branch_listeners_(false), + have_branch_listeners_(false), have_invoke_virtual_or_interface_listeners_(false), deoptimized_methods_lock_("deoptimized methods lock"), deoptimization_enabled_(false), @@ -431,11 +431,11 @@ void Instrumentation::AddListener(InstrumentationListener* listener, uint32_t ev method_unwind_listeners_, listener, &have_method_unwind_listeners_); - PotentiallyAddListenerTo(kBackwardBranch, + PotentiallyAddListenerTo(kBranch, events, - backward_branch_listeners_, + branch_listeners_, listener, - &have_backward_branch_listeners_); + &have_branch_listeners_); PotentiallyAddListenerTo(kInvokeVirtualOrInterface, events, invoke_virtual_or_interface_listeners_, @@ -508,11 +508,11 @@ void Instrumentation::RemoveListener(InstrumentationListener* listener, uint32_t method_unwind_listeners_, listener, &have_method_unwind_listeners_); - PotentiallyRemoveListenerFrom(kBackwardBranch, + PotentiallyRemoveListenerFrom(kBranch, events, - backward_branch_listeners_, + branch_listeners_, listener, - &have_backward_branch_listeners_); + &have_branch_listeners_); PotentiallyRemoveListenerFrom(kInvokeVirtualOrInterface, events, invoke_virtual_or_interface_listeners_, @@ -917,11 +917,13 @@ void Instrumentation::DexPcMovedEventImpl(Thread* thread, mirror::Object* this_o } } -void Instrumentation::BackwardBranchImpl(Thread* thread, ArtMethod* method, - int32_t offset) const { - for (InstrumentationListener* listener : backward_branch_listeners_) { +void Instrumentation::BranchImpl(Thread* thread, + ArtMethod* method, + uint32_t dex_pc, + int32_t offset) const { + for (InstrumentationListener* listener : branch_listeners_) { if (listener != nullptr) { - listener->BackwardBranch(thread, method, offset); + listener->Branch(thread, method, dex_pc, offset); } } } diff --git a/runtime/instrumentation.h b/runtime/instrumentation.h index b29245f052..56aeefc2f5 100644 --- a/runtime/instrumentation.h +++ b/runtime/instrumentation.h @@ -94,8 +94,11 @@ struct InstrumentationListener { virtual void ExceptionCaught(Thread* thread, mirror::Throwable* exception_object) SHARED_REQUIRES(Locks::mutator_lock_) = 0; - // Call-back for when we get a backward branch. - virtual void BackwardBranch(Thread* thread, ArtMethod* method, int32_t dex_pc_offset) + // Call-back for when we execute a branch. + virtual void Branch(Thread* thread, + ArtMethod* method, + uint32_t dex_pc, + int32_t dex_pc_offset) SHARED_REQUIRES(Locks::mutator_lock_) = 0; // Call-back for when we get an invokevirtual or an invokeinterface. @@ -122,7 +125,7 @@ class Instrumentation { kFieldRead = 0x10, kFieldWritten = 0x20, kExceptionCaught = 0x40, - kBackwardBranch = 0x80, + kBranch = 0x80, kInvokeVirtualOrInterface = 0x100, }; @@ -276,8 +279,8 @@ class Instrumentation { return have_exception_caught_listeners_; } - bool HasBackwardBranchListeners() const SHARED_REQUIRES(Locks::mutator_lock_) { - return have_backward_branch_listeners_; + bool HasBranchListeners() const SHARED_REQUIRES(Locks::mutator_lock_) { + return have_branch_listeners_; } bool HasInvokeVirtualOrInterfaceListeners() const SHARED_REQUIRES(Locks::mutator_lock_) { @@ -324,11 +327,11 @@ class Instrumentation { } } - // Inform listeners that a backward branch has been taken (only supported by the interpreter). - void BackwardBranch(Thread* thread, ArtMethod* method, int32_t offset) const + // Inform listeners that a branch has been taken (only supported by the interpreter). + void Branch(Thread* thread, ArtMethod* method, uint32_t dex_pc, int32_t offset) const SHARED_REQUIRES(Locks::mutator_lock_) { - if (UNLIKELY(HasBackwardBranchListeners())) { - BackwardBranchImpl(thread, method, offset); + if (UNLIKELY(HasBranchListeners())) { + BranchImpl(thread, method, dex_pc, offset); } } @@ -442,7 +445,7 @@ class Instrumentation { void DexPcMovedEventImpl(Thread* thread, mirror::Object* this_object, ArtMethod* method, uint32_t dex_pc) const SHARED_REQUIRES(Locks::mutator_lock_); - void BackwardBranchImpl(Thread* thread, ArtMethod* method, int32_t offset) const + void BranchImpl(Thread* thread, ArtMethod* method, uint32_t dex_pc, int32_t offset) const SHARED_REQUIRES(Locks::mutator_lock_); void InvokeVirtualOrInterfaceImpl(Thread* thread, mirror::Object* this_object, @@ -513,8 +516,8 @@ class Instrumentation { // Do we have any exception caught listeners? Short-cut to avoid taking the instrumentation_lock_. bool have_exception_caught_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any backward branch listeners? Short-cut to avoid taking the instrumentation_lock_. - bool have_backward_branch_listeners_ GUARDED_BY(Locks::mutator_lock_); + // Do we have any branch listeners? Short-cut to avoid taking the instrumentation_lock_. + bool have_branch_listeners_ GUARDED_BY(Locks::mutator_lock_); // Do we have any invoke listeners? Short-cut to avoid taking the instrumentation_lock_. bool have_invoke_virtual_or_interface_listeners_ GUARDED_BY(Locks::mutator_lock_); @@ -537,7 +540,7 @@ class Instrumentation { std::list<InstrumentationListener*> method_entry_listeners_ GUARDED_BY(Locks::mutator_lock_); std::list<InstrumentationListener*> method_exit_listeners_ GUARDED_BY(Locks::mutator_lock_); std::list<InstrumentationListener*> method_unwind_listeners_ GUARDED_BY(Locks::mutator_lock_); - std::list<InstrumentationListener*> backward_branch_listeners_ GUARDED_BY(Locks::mutator_lock_); + std::list<InstrumentationListener*> branch_listeners_ GUARDED_BY(Locks::mutator_lock_); std::list<InstrumentationListener*> invoke_virtual_or_interface_listeners_ GUARDED_BY(Locks::mutator_lock_); std::list<InstrumentationListener*> dex_pc_listeners_ GUARDED_BY(Locks::mutator_lock_); diff --git a/runtime/instrumentation_test.cc b/runtime/instrumentation_test.cc index e4688a21dd..56e3bc5745 100644 --- a/runtime/instrumentation_test.cc +++ b/runtime/instrumentation_test.cc @@ -37,7 +37,7 @@ class TestInstrumentationListener FINAL : public instrumentation::Instrumentatio : received_method_enter_event(false), received_method_exit_event(false), received_method_unwind_event(false), received_dex_pc_moved_event(false), received_field_read_event(false), received_field_written_event(false), - received_exception_caught_event(false), received_backward_branch_event(false), + received_exception_caught_event(false), received_branch_event(false), received_invoke_virtual_or_interface_event(false) {} virtual ~TestInstrumentationListener() {} @@ -100,11 +100,12 @@ class TestInstrumentationListener FINAL : public instrumentation::Instrumentatio received_exception_caught_event = true; } - void BackwardBranch(Thread* thread ATTRIBUTE_UNUSED, - ArtMethod* method ATTRIBUTE_UNUSED, - int32_t dex_pc_offset ATTRIBUTE_UNUSED) + void Branch(Thread* thread ATTRIBUTE_UNUSED, + ArtMethod* method ATTRIBUTE_UNUSED, + uint32_t dex_pc ATTRIBUTE_UNUSED, + int32_t dex_pc_offset ATTRIBUTE_UNUSED) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) { - received_backward_branch_event = true; + received_branch_event = true; } void InvokeVirtualOrInterface(Thread* thread ATTRIBUTE_UNUSED, @@ -124,7 +125,7 @@ class TestInstrumentationListener FINAL : public instrumentation::Instrumentatio received_field_read_event = false; received_field_written_event = false; received_exception_caught_event = false; - received_backward_branch_event = false; + received_branch_event = false; received_invoke_virtual_or_interface_event = false; } @@ -135,7 +136,7 @@ class TestInstrumentationListener FINAL : public instrumentation::Instrumentatio bool received_field_read_event; bool received_field_written_event; bool received_exception_caught_event; - bool received_backward_branch_event; + bool received_branch_event; bool received_invoke_virtual_or_interface_event; private: @@ -305,8 +306,8 @@ class InstrumentationTest : public CommonRuntimeTest { return instr->HasFieldWriteListeners(); case instrumentation::Instrumentation::kExceptionCaught: return instr->HasExceptionCaughtListeners(); - case instrumentation::Instrumentation::kBackwardBranch: - return instr->HasBackwardBranchListeners(); + case instrumentation::Instrumentation::kBranch: + return instr->HasBranchListeners(); case instrumentation::Instrumentation::kInvokeVirtualOrInterface: return instr->HasInvokeVirtualOrInterfaceListeners(); default: @@ -349,8 +350,8 @@ class InstrumentationTest : public CommonRuntimeTest { self->ClearException(); break; } - case instrumentation::Instrumentation::kBackwardBranch: - instr->BackwardBranch(self, method, dex_pc); + case instrumentation::Instrumentation::kBranch: + instr->Branch(self, method, dex_pc, -1); break; case instrumentation::Instrumentation::kInvokeVirtualOrInterface: instr->InvokeVirtualOrInterface(self, obj, method, dex_pc, method); @@ -378,8 +379,8 @@ class InstrumentationTest : public CommonRuntimeTest { return listener.received_field_written_event; case instrumentation::Instrumentation::kExceptionCaught: return listener.received_exception_caught_event; - case instrumentation::Instrumentation::kBackwardBranch: - return listener.received_backward_branch_event; + case instrumentation::Instrumentation::kBranch: + return listener.received_branch_event; case instrumentation::Instrumentation::kInvokeVirtualOrInterface: return listener.received_invoke_virtual_or_interface_event; default: @@ -441,8 +442,8 @@ TEST_F(InstrumentationTest, ExceptionCaughtEvent) { TestEvent(instrumentation::Instrumentation::kExceptionCaught); } -TEST_F(InstrumentationTest, BackwardBranchEvent) { - TestEvent(instrumentation::Instrumentation::kBackwardBranch); +TEST_F(InstrumentationTest, BranchEvent) { + TestEvent(instrumentation::Instrumentation::kBranch); } TEST_F(InstrumentationTest, InvokeVirtualOrInterfaceEvent) { diff --git a/runtime/interpreter/interpreter_goto_table_impl.cc b/runtime/interpreter/interpreter_goto_table_impl.cc index 9766299ae0..ca006214c8 100644 --- a/runtime/interpreter/interpreter_goto_table_impl.cc +++ b/runtime/interpreter/interpreter_goto_table_impl.cc @@ -63,10 +63,10 @@ namespace interpreter { currentHandlersTable = handlersTable[ \ Runtime::Current()->GetInstrumentation()->GetInterpreterHandlerTable()] -#define BACKWARD_BRANCH_INSTRUMENTATION(offset) \ +#define BRANCH_INSTRUMENTATION(offset) \ do { \ instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); \ - instrumentation->BackwardBranch(self, shadow_frame.GetMethod(), offset); \ + instrumentation->Branch(self, shadow_frame.GetMethod(), dex_pc, offset); \ } while (false) #define UNREACHABLE_CODE_CHECK() \ @@ -633,8 +633,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(GOTO) { int8_t offset = inst->VRegA_10t(inst_data); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -646,8 +646,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(GOTO_16) { int16_t offset = inst->VRegA_20t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -659,8 +659,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(GOTO_32) { int32_t offset = inst->VRegA_30t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -672,8 +672,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(PACKED_SWITCH) { int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -685,8 +685,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(SPARSE_SWITCH) { int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -788,8 +788,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(IF_EQ) { if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -806,8 +806,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -824,8 +824,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -842,8 +842,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -860,8 +860,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -878,8 +878,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -895,8 +895,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(IF_EQZ) { if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -912,8 +912,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(IF_NEZ) { if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -929,8 +929,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(IF_LTZ) { if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -946,8 +946,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(IF_GEZ) { if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -963,8 +963,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(IF_GTZ) { if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); @@ -980,8 +980,8 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF HANDLE_INSTRUCTION_START(IF_LEZ) { if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); if (UNLIKELY(self->TestAllFlags())) { self->CheckSuspend(); UPDATE_HANDLER_TABLE(); diff --git a/runtime/interpreter/interpreter_switch_impl.cc b/runtime/interpreter/interpreter_switch_impl.cc index bab0d40000..c3b75b29e7 100644 --- a/runtime/interpreter/interpreter_switch_impl.cc +++ b/runtime/interpreter/interpreter_switch_impl.cc @@ -69,9 +69,9 @@ namespace interpreter { } \ } while (false) -#define BACKWARD_BRANCH_INSTRUMENTATION(offset) \ +#define BRANCH_INSTRUMENTATION(offset) \ do { \ - instrumentation->BackwardBranch(self, shadow_frame.GetMethod(), offset); \ + instrumentation->Branch(self, shadow_frame.GetMethod(), dex_pc, offset); \ } while (false) static bool IsExperimentalInstructionEnabled(const Instruction *inst) { @@ -565,8 +565,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, case Instruction::GOTO: { PREAMBLE(); int8_t offset = inst->VRegA_10t(inst_data); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -575,8 +575,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, case Instruction::GOTO_16: { PREAMBLE(); int16_t offset = inst->VRegA_20t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -585,8 +585,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, case Instruction::GOTO_32: { PREAMBLE(); int32_t offset = inst->VRegA_30t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -595,8 +595,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, case Instruction::PACKED_SWITCH: { PREAMBLE(); int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -605,8 +605,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, case Instruction::SPARSE_SWITCH: { PREAMBLE(); int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -709,8 +709,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -724,8 +724,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -739,8 +739,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -754,8 +754,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -769,8 +769,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -784,8 +784,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { int16_t offset = inst->VRegC_22t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -798,8 +798,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, PREAMBLE(); if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -812,8 +812,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, PREAMBLE(); if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -826,8 +826,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, PREAMBLE(); if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -840,8 +840,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, PREAMBLE(); if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -854,8 +854,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, PREAMBLE(); if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); @@ -868,8 +868,8 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, PREAMBLE(); if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { int16_t offset = inst->VRegB_21t(); + BRANCH_INSTRUMENTATION(offset); if (IsBackwardBranch(offset)) { - BACKWARD_BRANCH_INSTRUMENTATION(offset); self->AllowThreadSuspension(); } inst = inst->RelativeAt(offset); diff --git a/runtime/jit/jit_instrumentation.cc b/runtime/jit/jit_instrumentation.cc index 4cbaf2cbfa..0cde00ae14 100644 --- a/runtime/jit/jit_instrumentation.cc +++ b/runtime/jit/jit_instrumentation.cc @@ -165,11 +165,14 @@ void JitInstrumentationListener::MethodEntered(Thread* thread, instrumentation_cache_->AddSamples(thread, method, 1); } -void JitInstrumentationListener::BackwardBranch(Thread* thread, - ArtMethod* method, - int32_t dex_pc_offset) { - CHECK_LE(dex_pc_offset, 0); - instrumentation_cache_->AddSamples(thread, method, 1); +void JitInstrumentationListener::Branch(Thread* thread, + ArtMethod* method, + uint32_t dex_pc, + int32_t dex_pc_offset) { + if (dex_pc_offset < 0) { + // Increment method hotness if it is a backward branch. + instrumentation_cache_->AddSamples(thread, method, 1); + } } void JitInstrumentationListener::InvokeVirtualOrInterface(Thread* thread, diff --git a/runtime/jit/jit_instrumentation.h b/runtime/jit/jit_instrumentation.h index 15969e4d53..620c087455 100644 --- a/runtime/jit/jit_instrumentation.h +++ b/runtime/jit/jit_instrumentation.h @@ -70,7 +70,7 @@ class JitInstrumentationListener : public instrumentation::InstrumentationListen void DexPcMoved(Thread* /*self*/, mirror::Object* /*this_object*/, ArtMethod* /*method*/, uint32_t /*new_dex_pc*/) OVERRIDE { } - void BackwardBranch(Thread* thread, ArtMethod* method, int32_t dex_pc_offset) + void Branch(Thread* thread, ArtMethod* method, uint32_t dex_pc, int32_t dex_pc_offset) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_); void InvokeVirtualOrInterface(Thread* thread, @@ -84,7 +84,7 @@ class JitInstrumentationListener : public instrumentation::InstrumentationListen static constexpr uint32_t kJitEvents = instrumentation::Instrumentation::kMethodEntered | - instrumentation::Instrumentation::kBackwardBranch | + instrumentation::Instrumentation::kBranch | instrumentation::Instrumentation::kInvokeVirtualOrInterface; private: diff --git a/runtime/trace.cc b/runtime/trace.cc index 5815f7a97c..99b2296b60 100644 --- a/runtime/trace.cc +++ b/runtime/trace.cc @@ -815,10 +815,10 @@ void Trace::ExceptionCaught(Thread* thread ATTRIBUTE_UNUSED, LOG(ERROR) << "Unexpected exception caught event in tracing"; } -void Trace::BackwardBranch(Thread* /*thread*/, ArtMethod* method, - int32_t /*dex_pc_offset*/) +void Trace::Branch(Thread* /*thread*/, ArtMethod* method, + uint32_t /*dex_pc*/, int32_t /*dex_pc_offset*/) SHARED_REQUIRES(Locks::mutator_lock_) { - LOG(ERROR) << "Unexpected backward branch event in tracing" << PrettyMethod(method); + LOG(ERROR) << "Unexpected branch event in tracing" << PrettyMethod(method); } void Trace::InvokeVirtualOrInterface(Thread*, diff --git a/runtime/trace.h b/runtime/trace.h index 356a81f282..80f1a4c1bc 100644 --- a/runtime/trace.h +++ b/runtime/trace.h @@ -164,7 +164,7 @@ class Trace FINAL : public instrumentation::InstrumentationListener { SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!*unique_methods_lock_) OVERRIDE; void ExceptionCaught(Thread* thread, mirror::Throwable* exception_object) SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!*unique_methods_lock_) OVERRIDE; - void BackwardBranch(Thread* thread, ArtMethod* method, int32_t dex_pc_offset) + void Branch(Thread* thread, ArtMethod* method, uint32_t dex_pc, int32_t dex_pc_offset) SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!*unique_methods_lock_) OVERRIDE; void InvokeVirtualOrInterface(Thread* thread, mirror::Object* this_object, |