Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 47fc1ce1b2f62ba22dd739aeba225c14da1b9230..15e5b6934af400b996bc4d8db528194693042edf 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -7527,6 +7527,71 @@ void Isolate::GetStackSample(const RegisterState& state, void** frames, |
} |
+void Isolate::GetStackSample(RegisterState* state, void** frames, |
alph
2016/04/27 22:29:20
v8 usually do not put that much implementation spe
|
+ size_t frames_limit, SampleInfo* sample_info) { |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
+#if defined(USE_SIMULATOR) |
+ i::Simulator *simulator = isolate->thread_local_top()->simulator_; |
+ if (simulator != NULL) { |
+#if V8_TARGET_ARCH_ARM |
+ if (!simulator->has_bad_pc()) { |
+ state->pc = reinterpret_cast<void*>(simulator->get_pc()); |
+ } |
+ state->sp = reinterpret_cast<void*>(simulator->get_register( |
+ i::Simulator::sp)); |
+ state->fp = reinterpret_cast<void*>(simulator->get_register( |
+ i::Simulator::r11)); |
+#elif V8_TARGET_ARCH_ARM64 |
+ if (simulator->sp() == 0 || simulator->fp() == 0) { |
+ // It's possible that the simulator is interrupted while it is updating |
+ // the sp or fp register. ARM64 simulator does this in two steps: |
+ // first setting it to zero and then setting it to a new value. |
+ // Bailout if sp/fp doesn't contain the new value. |
+ // |
+ // FIXME: The above doesn't really solve the issue. |
+ // If a 64-bit target is executed on a 32-bit host even the final |
+ // write is non-atomic, so it might obtain a half of the result. |
+ // Moreover as long as the register set code uses memcpy (as of now), |
+ // it is not guaranteed to be atomic even when both host and target |
+ // are of same bitness. |
+ return; |
+ } |
+ state->pc = reinterpret_cast<void*>(simulator->pc()); |
+ state->sp = reinterpret_cast<void*>(simulator->sp()); |
+ state->fp = reinterpret_cast<void*>(simulator->fp()); |
+#elif V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
+ if (!simulator->has_bad_pc()) { |
+ state->pc = reinterpret_cast<void*>(simulator->get_pc()); |
+ } |
+ state->sp = reinterpret_cast<void*>(simulator->get_register( |
+ i::Simulator::sp)); |
+ state->fp = reinterpret_cast<void*>(simulator->get_register( |
+ i::Simulator::fp)); |
+#elif V8_TARGET_ARCH_PPC |
+ if (!simulator->has_bad_pc()) { |
+ state->pc = reinterpret_cast<void*>(simulator->get_pc()); |
+ } |
+ state->sp = |
+ reinterpret_cast<void*>(simulator->get_register(i::Simulator::sp)); |
+ state->fp = |
+ reinterpret_cast<void*>(simulator->get_register(i::Simulator::fp)); |
+#elif V8_TARGET_ARCH_S390 |
+ if (!simulator->has_bad_pc()) { |
+ state->pc = reinterpret_cast<void*>(simulator->get_pc()); |
+ } |
+ state->sp = |
+ reinterpret_cast<void*>(simulator->get_register(i::Simulator::sp)); |
+ state->fp = |
+ reinterpret_cast<void*>(simulator->get_register(i::Simulator::fp)); |
+#endif |
+ } |
+#endif // USE_SIMULATOR |
+ i::TickSample::GetStackSample(isolate, *state, |
+ i::TickSample::kSkipCEntryFrame, |
+ frames, frames_limit, sample_info); |
+} |
+ |
+ |
void Isolate::SetEventLogger(LogEventCallback that) { |
// Do not overwrite the event logger if we want to log explicitly. |
if (i::FLAG_log_internal_timer_events) return; |