OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "sampler.h" | 28 #include "sampler.h" |
29 | 29 |
30 #if V8_OS_POSIX && !V8_OS_CYGWIN | 30 #if V8_OS_POSIX && !V8_OS_CYGWIN |
31 | 31 |
32 #define USE_SIGNALS | 32 #define USE_SIGNALS |
33 | 33 |
34 #include <errno.h> | 34 #include <errno.h> |
35 #include <pthread.h> | 35 #include <pthread.h> |
36 #include <signal.h> | 36 #include <signal.h> |
37 #include <sys/time.h> | 37 #include <sys/time.h> |
| 38 |
| 39 #if !V8_OS_QNX |
38 #include <sys/syscall.h> | 40 #include <sys/syscall.h> |
| 41 #endif |
39 | 42 |
40 #if V8_OS_MACOSX | 43 #if V8_OS_MACOSX |
41 #include <mach/mach.h> | 44 #include <mach/mach.h> |
42 // OpenBSD doesn't have <ucontext.h>. ucontext_t lives in <signal.h> | 45 // OpenBSD doesn't have <ucontext.h>. ucontext_t lives in <signal.h> |
43 // and is a typedef for struct sigcontext. There is no uc_mcontext. | 46 // and is a typedef for struct sigcontext. There is no uc_mcontext. |
44 #elif(!V8_OS_ANDROID || defined(__BIONIC_HAVE_UCONTEXT_T)) \ | 47 #elif(!V8_OS_ANDROID || defined(__BIONIC_HAVE_UCONTEXT_T)) \ |
45 && !V8_OS_OPENBSD | 48 && !V8_OS_OPENBSD |
46 #include <ucontext.h> | 49 #include <ucontext.h> |
47 #endif | 50 #endif |
| 51 |
48 #include <unistd.h> | 52 #include <unistd.h> |
49 | 53 |
50 // GLibc on ARM defines mcontext_t has a typedef for 'struct sigcontext'. | 54 // GLibc on ARM defines mcontext_t has a typedef for 'struct sigcontext'. |
51 // Old versions of the C library <signal.h> didn't define the type. | 55 // Old versions of the C library <signal.h> didn't define the type. |
52 #if V8_OS_ANDROID && !defined(__BIONIC_HAVE_UCONTEXT_T) && \ | 56 #if V8_OS_ANDROID && !defined(__BIONIC_HAVE_UCONTEXT_T) && \ |
53 defined(__arm__) && !defined(__BIONIC_HAVE_STRUCT_SIGCONTEXT) | 57 defined(__arm__) && !defined(__BIONIC_HAVE_STRUCT_SIGCONTEXT) |
54 #include <asm/sigcontext.h> | 58 #include <asm/sigcontext.h> |
55 #endif | 59 #endif |
56 | 60 |
57 #elif V8_OS_WIN || V8_OS_CYGWIN | 61 #elif V8_OS_WIN || V8_OS_CYGWIN |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 | 263 |
260 static bool Installed() { | 264 static bool Installed() { |
261 return signal_handler_installed_; | 265 return signal_handler_installed_; |
262 } | 266 } |
263 | 267 |
264 private: | 268 private: |
265 static void Install() { | 269 static void Install() { |
266 struct sigaction sa; | 270 struct sigaction sa; |
267 sa.sa_sigaction = &HandleProfilerSignal; | 271 sa.sa_sigaction = &HandleProfilerSignal; |
268 sigemptyset(&sa.sa_mask); | 272 sigemptyset(&sa.sa_mask); |
| 273 #if V8_OS_QNX |
| 274 sa.sa_flags = SA_SIGINFO; |
| 275 #else |
269 sa.sa_flags = SA_RESTART | SA_SIGINFO; | 276 sa.sa_flags = SA_RESTART | SA_SIGINFO; |
| 277 #endif |
270 signal_handler_installed_ = | 278 signal_handler_installed_ = |
271 (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0); | 279 (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0); |
272 } | 280 } |
273 | 281 |
274 static void Restore() { | 282 static void Restore() { |
275 if (signal_handler_installed_) { | 283 if (signal_handler_installed_) { |
276 sigaction(SIGPROF, &old_signal_handler_, 0); | 284 sigaction(SIGPROF, &old_signal_handler_, 0); |
277 signal_handler_installed_ = false; | 285 signal_handler_installed_ = false; |
278 } | 286 } |
279 } | 287 } |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 state.fp = reinterpret_cast<Address>(ucontext->sc_ebp); | 416 state.fp = reinterpret_cast<Address>(ucontext->sc_ebp); |
409 #elif V8_HOST_ARCH_X64 | 417 #elif V8_HOST_ARCH_X64 |
410 state.pc = reinterpret_cast<Address>(ucontext->sc_rip); | 418 state.pc = reinterpret_cast<Address>(ucontext->sc_rip); |
411 state.sp = reinterpret_cast<Address>(ucontext->sc_rsp); | 419 state.sp = reinterpret_cast<Address>(ucontext->sc_rsp); |
412 state.fp = reinterpret_cast<Address>(ucontext->sc_rbp); | 420 state.fp = reinterpret_cast<Address>(ucontext->sc_rbp); |
413 #endif // V8_HOST_ARCH_* | 421 #endif // V8_HOST_ARCH_* |
414 #elif V8_OS_SOLARIS | 422 #elif V8_OS_SOLARIS |
415 state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_PC]); | 423 state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_PC]); |
416 state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_SP]); | 424 state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_SP]); |
417 state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_FP]); | 425 state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_FP]); |
418 #endif // V8_OS_SOLARIS | 426 #elif V8_OS_QNX |
| 427 #if V8_HOST_ARCH_IA32 |
| 428 state.pc = reinterpret_cast<Address>(mcontext.cpu.eip); |
| 429 state.sp = reinterpret_cast<Address>(mcontext.cpu.esp); |
| 430 state.fp = reinterpret_cast<Address>(mcontext.cpu.ebp); |
| 431 #elif V8_HOST_ARCH_ARM |
| 432 state.pc = reinterpret_cast<Address>(mcontext.cpu.gpr[ARM_REG_PC]); |
| 433 state.sp = reinterpret_cast<Address>(mcontext.cpu.gpr[ARM_REG_SP]); |
| 434 state.fp = reinterpret_cast<Address>(mcontext.cpu.gpr[ARM_REG_FP]); |
| 435 #endif // V8_HOST_ARCH_* |
| 436 #endif // V8_OS_QNX |
419 #endif // USE_SIMULATOR | 437 #endif // USE_SIMULATOR |
420 sampler->SampleStack(state); | 438 sampler->SampleStack(state); |
421 #endif // V8_OS_NACL | 439 #endif // V8_OS_NACL |
422 } | 440 } |
423 | 441 |
424 #endif | 442 #endif |
425 | 443 |
426 | 444 |
427 class SamplerThread : public Thread { | 445 class SamplerThread : public Thread { |
428 public: | 446 public: |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 #endif // USE_SIMULATOR | 696 #endif // USE_SIMULATOR |
679 SampleStack(state); | 697 SampleStack(state); |
680 } | 698 } |
681 ResumeThread(profiled_thread); | 699 ResumeThread(profiled_thread); |
682 } | 700 } |
683 | 701 |
684 #endif // USE_SIGNALS | 702 #endif // USE_SIGNALS |
685 | 703 |
686 | 704 |
687 } } // namespace v8::internal | 705 } } // namespace v8::internal |
OLD | NEW |