Index: src/sampler.cc |
diff --git a/src/sampler.cc b/src/sampler.cc |
index d72ed1acdb832e224c490b736954bf6d908ebb88..6e451f0bdeab3bb5cbed51e113a8b9ff72784464 100644 |
--- a/src/sampler.cc |
+++ b/src/sampler.cc |
@@ -38,7 +38,10 @@ |
#include <signal.h> |
#include <sys/time.h> |
#include <sys/syscall.h> |
-#if !defined(__ANDROID__) || defined(__BIONIC_HAVE_UCONTEXT_T) |
+// OpenBSD doesn't have <ucontext.h>. ucontext_t lives in <signal.h> |
+// and is a typedef for struct sigcontext. There is no uc_mcontext. |
+#if (!defined(__ANDROID__) || defined(__BIONIC_HAVE_UCONTEXT_T)) \ |
+ && !defined(__OpenBSD__) |
#include <ucontext.h> |
#endif |
#include <unistd.h> |
@@ -330,7 +333,9 @@ void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info, |
#else |
// Extracting the sample from the context is extremely machine dependent. |
ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); |
+#if !defined(__OpenBSD__) |
mcontext_t& mcontext = ucontext->uc_mcontext; |
+#endif |
#if defined(__linux__) || defined(__ANDROID__) |
#if V8_HOST_ARCH_IA32 |
state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_EIP]); |
@@ -384,7 +389,6 @@ void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info, |
state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RBP]); |
#endif // V8_HOST_ARCH_* |
#elif defined(__OpenBSD__) |
- USE(mcontext); |
#if V8_HOST_ARCH_IA32 |
state.pc = reinterpret_cast<Address>(ucontext->sc_eip); |
state.sp = reinterpret_cast<Address>(ucontext->sc_esp); |