Chromium Code Reviews| Index: runtime/vm/simulator_dbc.cc |
| diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc |
| index afb5487f7b648781c6d84937682f9aff3616295b..028a3e0a40ca1753d6f007900e32547e2296c3f8 100644 |
| --- a/runtime/vm/simulator_dbc.cc |
| +++ b/runtime/vm/simulator_dbc.cc |
| @@ -542,6 +542,8 @@ Simulator::Simulator() : stack_(NULL), fp_(NULL) { |
| sizeof(uintptr_t)]; |
| last_setjmp_buffer_ = NULL; |
| top_exit_frame_info_ = 0; |
| + |
| + NOT_IN_PRODUCT(icount_ = 0;) |
| } |
| @@ -574,6 +576,24 @@ uword Simulator::StackTop() const { |
| (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer); |
| } |
|
zra
2017/06/30 22:08:42
Two newlines between functions in source files.
alexmarkov
2017/06/30 23:02:00
Done.
|
| +#if !defined(PRODUCT) |
| +// Returns true if tracing of executed instructions is enabled. |
| +DART_FORCE_INLINE bool Simulator::IsTracingExecution() const { |
| + return icount_ > FLAG_trace_sim_after; |
| +} |
| + |
| + |
| +// Prints bytecode instruction at given pc for instruction tracing. |
| +DART_NOINLINE void Simulator::TraceInstruction(uint32_t* pc) const { |
| + THR_Print("%" Pu64 " ", icount_); |
| + if (FLAG_support_disassembler) { |
| + Disassembler::Disassemble(reinterpret_cast<uword>(pc), |
| + reinterpret_cast<uword>(pc + 1)); |
| + } else { |
| + THR_Print("Disassembler not supported in this mode.\n"); |
| + } |
| +} |
| +#endif // !defined(PRODUCT) |
|
zra
2017/06/30 22:08:41
ditto
alexmarkov
2017/06/30 23:02:00
Done.
|
| // Calls into the Dart runtime are based on this interface. |
| typedef void (*SimulatorRuntimeCall)(NativeArguments arguments); |
| @@ -984,12 +1004,24 @@ static DART_NOINLINE bool InvokeNativeAutoScopeWrapper(Thread* thread, |
| // Note: all macro helpers are intended to be used only inside Simulator::Call. |
| +// Counts and prints executed bytecode instructions (in a non-PRODUCT mode). |
| +#if !defined(PRODUCT) |
| +#define TRACE_INSTRUCTION \ |
| + icount_++; \ |
| + if (IsTracingExecution()) { \ |
| + TraceInstruction(pc - 1); \ |
| + } |
| +#else |
| +#define TRACE_INSTRUCTION |
| +#endif // !defined(PRODUCT) |
| + |
| // Decode opcode and A part of the given value and dispatch to the |
| // corresponding bytecode handler. |
| #define DISPATCH_OP(val) \ |
| do { \ |
| op = (val); \ |
| rA = ((op >> 8) & 0xFF); \ |
| + TRACE_INSTRUCTION \ |
| goto* dispatch[op & 0xFF]; \ |
| } while (0) |