Index: src/platform-openbsd.cc |
diff --git a/src/platform-openbsd.cc b/src/platform-openbsd.cc |
index a53e30756d0ea4aae649c30972b18092381d3d63..aca03be3e5ac5197584f0614b8c089ae2a8e4a9b 100644 |
--- a/src/platform-openbsd.cc |
+++ b/src/platform-openbsd.cc |
@@ -53,6 +53,7 @@ |
#include "platform-posix.h" |
#include "platform.h" |
+#include "simulator.h" |
#include "v8threads.h" |
#include "vm-state-inl.h" |
@@ -732,6 +733,22 @@ static pthread_t GetThreadID() { |
return pthread_self(); |
} |
+ |
+class Sampler::PlatformData : public Malloced { |
+ public: |
+ PlatformData() |
+ : vm_tid_(GetThreadID()), |
+ profiled_thread_id_(ThreadId::Current()) {} |
+ |
+ pthread_t vm_tid() const { return vm_tid_; } |
+ ThreadId profiled_thread_id() { return profiled_thread_id_; } |
+ |
+ private: |
+ pthread_t vm_tid_; |
+ ThreadId profiled_thread_id_; |
+}; |
+ |
+ |
static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { |
USE(info); |
if (signal != SIGPROF) return; |
@@ -748,6 +765,18 @@ static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { |
Sampler* sampler = isolate->logger()->sampler(); |
if (sampler == NULL || !sampler->IsActive()) return; |
+#if defined(USE_SIMULATOR) |
+#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS |
+ ThreadId thread_id = sampler->platform_data()->profiled_thread_id(); |
+ Isolate::PerIsolateThreadData* per_thread_data = isolate-> |
+ FindPerThreadDataForThread(thread_id); |
+ if (!per_thread_data) return; |
+ Simulator* sim = per_thread_data->simulator(); |
+ // Check if there is active simulator before allocating TickSample. |
+ if (!sim) return; |
+#endif |
+#endif // USE_SIMULATOR |
+ |
TickSample sample_obj; |
TickSample* sample = isolate->cpu_profiler()->TickSampleEvent(); |
if (sample == NULL) sample = &sample_obj; |
@@ -755,6 +784,17 @@ static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { |
// Extracting the sample from the context is extremely machine dependent. |
sample->state = isolate->current_vm_state(); |
ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); |
+#if defined(USE_SIMULATOR) |
+#if V8_TARGET_ARCH_ARM |
+ sample->pc = reinterpret_cast<Address>(sim->get_register(Simulator::pc)); |
+ sample->sp = reinterpret_cast<Address>(sim->get_register(Simulator::sp)); |
+ sample->fp = reinterpret_cast<Address>(sim->get_register(Simulator::r11)); |
+#elif V8_TARGET_ARCH_MIPS |
+ sample->pc = reinterpret_cast<Address>(sim->get_register(Simulator::pc)); |
+ sample->sp = reinterpret_cast<Address>(sim->get_register(Simulator::sp)); |
+ sample->fp = reinterpret_cast<Address>(sim->get_register(Simulator::fp)); |
+#endif |
+#else |
#ifdef __NetBSD__ |
mcontext_t& mcontext = ucontext->uc_mcontext; |
#if V8_HOST_ARCH_IA32 |
@@ -777,22 +817,12 @@ static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { |
sample->fp = reinterpret_cast<Address>(ucontext->sc_rbp); |
#endif // V8_HOST_ARCH |
#endif // __NetBSD__ |
+#endif // USE_SIMULATOR |
sampler->SampleStack(sample); |
sampler->Tick(sample); |
} |
-class Sampler::PlatformData : public Malloced { |
- public: |
- PlatformData() : vm_tid_(GetThreadID()) {} |
- |
- pthread_t vm_tid() const { return vm_tid_; } |
- |
- private: |
- pthread_t vm_tid_; |
-}; |
- |
- |
class SignalSender : public Thread { |
public: |
static const int kSignalSenderStackSize = 64 * KB; |