Chromium Code Reviews| Index: runtime/vm/simulator_mips.cc |
| =================================================================== |
| --- runtime/vm/simulator_mips.cc (revision 42479) |
| +++ runtime/vm/simulator_mips.cc (working copy) |
| @@ -23,8 +23,9 @@ |
| namespace dart { |
| -DEFINE_FLAG(bool, trace_sim, false, "Trace simulator execution."); |
| -DEFINE_FLAG(int, stop_sim_at, 0, |
| +DEFINE_FLAG(int, trace_sim_after, -1, |
| + "Trace simulator execution after instruction count reached."); |
| +DEFINE_FLAG(int, stop_sim_at, -1, |
| "Instruction address or instruction count to stop simulator at."); |
| @@ -592,8 +593,13 @@ |
| OS::Print("Not at debugger stop.\n"); |
| } |
| } else if (strcmp(cmd, "trace") == 0) { |
| - FLAG_trace_sim = !FLAG_trace_sim; |
| - OS::Print("execution tracing %s\n", FLAG_trace_sim ? "on" : "off"); |
| + if (FLAG_trace_sim_after == -1) { |
| + FLAG_trace_sim_after = sim_->get_icount(); |
| + OS::Print("execution tracing on\n"); |
| + } else { |
| + FLAG_trace_sim_after = -1; |
| + OS::Print("execution tracing off\n"); |
| + } |
| } else if (strcmp(cmd, "bt") == 0) { |
| PrintBacktrace(); |
| } else { |
| @@ -1202,11 +1208,9 @@ |
| } else if (instr->BreakCodeField() == Instr::kSimulatorMessageCode) { |
| const char* message = *reinterpret_cast<const char**>( |
| reinterpret_cast<intptr_t>(instr) - Instr::kInstrSize); |
| - if (FLAG_trace_sim) { |
| + if (static_cast<uintptr_t>(icount_) > |
|
zra
2014/12/19 17:49:47
Same comment.
regis
2014/12/22 20:17:34
Done.
|
| + static_cast<uintptr_t>(FLAG_trace_sim_after)) { |
| OS::Print("Message: %s\n", message); |
| - } else { |
| - OS::PrintErr("Bad break code: 0x%x\n", instr->InstructionBits()); |
| - UnimplementedInstruction(instr); |
| } |
| } else if (instr->BreakCodeField() == Instr::kSimulatorRedirectCode) { |
| SimulatorSetjmpBuffer buffer(this); |
| @@ -1215,7 +1219,8 @@ |
| int32_t saved_ra = get_register(RA); |
| Redirection* redirection = Redirection::FromBreakInstruction(instr); |
| uword external = redirection->external_function(); |
| - if (FLAG_trace_sim) { |
| + if (static_cast<uintptr_t>(icount_) > |
| + static_cast<uintptr_t>(FLAG_trace_sim_after)) { |
| OS::Print("Call to host function at 0x%" Pd "\n", external); |
| } |
| @@ -1966,7 +1971,9 @@ |
| void Simulator::InstructionDecode(Instr* instr) { |
| - if (FLAG_trace_sim) { |
| + if (static_cast<uintptr_t>(icount_) > |
| + static_cast<uintptr_t>(FLAG_trace_sim_after)) { |
| + OS::Print("%u ", icount_); |
| const uword start = reinterpret_cast<uword>(instr); |
| const uword end = start + Instr::kInstrSize; |
| Disassembler::Disassemble(start, end); |
| @@ -2265,7 +2272,7 @@ |
| delay_slot_ = true; |
| icount_++; |
| Instr* instr = Instr::At(pc_ + Instr::kInstrSize); |
| - if (FLAG_stop_sim_at != 0) { |
| + if (FLAG_stop_sim_at != -1) { |
| if (static_cast<int>(icount_) == FLAG_stop_sim_at) { |
| SimulatorDebugger dbg(this); |
| dbg.Stop(instr, "Instruction count reached"); |
| @@ -2280,7 +2287,7 @@ |
| void Simulator::Execute() { |
| - if (FLAG_stop_sim_at == 0) { |
| + if (FLAG_stop_sim_at == -1) { |
| // Fast version of the dispatch loop without checking whether the simulator |
| // should be stopping at a particular executed instruction. |
| while (pc_ != kEndSimulatingPC) { |