| 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 20 matching lines...) Expand all Loading... |
| 31 || defined(__NetBSD__) || defined(__sun) || defined(__ANDROID__) \ | 31 || defined(__NetBSD__) || defined(__sun) || defined(__ANDROID__) \ |
| 32 || defined(__native_client__) | 32 || defined(__native_client__) |
| 33 | 33 |
| 34 #define USE_SIGNALS | 34 #define USE_SIGNALS |
| 35 | 35 |
| 36 #include <errno.h> | 36 #include <errno.h> |
| 37 #include <pthread.h> | 37 #include <pthread.h> |
| 38 #include <signal.h> | 38 #include <signal.h> |
| 39 #include <sys/time.h> | 39 #include <sys/time.h> |
| 40 #include <sys/syscall.h> | 40 #include <sys/syscall.h> |
| 41 #if !defined(__ANDROID__) || defined(__BIONIC_HAVE_UCONTEXT_T) | 41 // OpenBSD doesn't have <ucontext.h>. ucontext_t lives in <signal.h> |
| 42 // and is a typedef for struct sigcontext. There is no uc_mcontext. |
| 43 #if (!defined(__ANDROID__) || defined(__BIONIC_HAVE_UCONTEXT_T)) \ |
| 44 && !defined(__OpenBSD__) |
| 42 #include <ucontext.h> | 45 #include <ucontext.h> |
| 43 #endif | 46 #endif |
| 44 #include <unistd.h> | 47 #include <unistd.h> |
| 45 | 48 |
| 46 // GLibc on ARM defines mcontext_t has a typedef for 'struct sigcontext'. | 49 // GLibc on ARM defines mcontext_t has a typedef for 'struct sigcontext'. |
| 47 // Old versions of the C library <signal.h> didn't define the type. | 50 // Old versions of the C library <signal.h> didn't define the type. |
| 48 #if defined(__ANDROID__) && !defined(__BIONIC_HAVE_UCONTEXT_T) && \ | 51 #if defined(__ANDROID__) && !defined(__BIONIC_HAVE_UCONTEXT_T) && \ |
| 49 defined(__arm__) && !defined(__BIONIC_HAVE_STRUCT_SIGCONTEXT) | 52 defined(__arm__) && !defined(__BIONIC_HAVE_STRUCT_SIGCONTEXT) |
| 50 #include <asm/sigcontext.h> | 53 #include <asm/sigcontext.h> |
| 51 #endif | 54 #endif |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 | 326 |
| 324 RegisterState state; | 327 RegisterState state; |
| 325 | 328 |
| 326 #if defined(USE_SIMULATOR) | 329 #if defined(USE_SIMULATOR) |
| 327 SimulatorHelper helper; | 330 SimulatorHelper helper; |
| 328 if (!helper.Init(sampler, isolate)) return; | 331 if (!helper.Init(sampler, isolate)) return; |
| 329 helper.FillRegisters(&state); | 332 helper.FillRegisters(&state); |
| 330 #else | 333 #else |
| 331 // Extracting the sample from the context is extremely machine dependent. | 334 // Extracting the sample from the context is extremely machine dependent. |
| 332 ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); | 335 ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); |
| 336 #if !defined(__OpenBSD__) |
| 333 mcontext_t& mcontext = ucontext->uc_mcontext; | 337 mcontext_t& mcontext = ucontext->uc_mcontext; |
| 338 #endif |
| 334 #if defined(__linux__) || defined(__ANDROID__) | 339 #if defined(__linux__) || defined(__ANDROID__) |
| 335 #if V8_HOST_ARCH_IA32 | 340 #if V8_HOST_ARCH_IA32 |
| 336 state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_EIP]); | 341 state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_EIP]); |
| 337 state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_ESP]); | 342 state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_ESP]); |
| 338 state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_EBP]); | 343 state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_EBP]); |
| 339 #elif V8_HOST_ARCH_X64 | 344 #elif V8_HOST_ARCH_X64 |
| 340 state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_RIP]); | 345 state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_RIP]); |
| 341 state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_RSP]); | 346 state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_RSP]); |
| 342 state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_RBP]); | 347 state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_RBP]); |
| 343 #elif V8_HOST_ARCH_ARM | 348 #elif V8_HOST_ARCH_ARM |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 #if V8_HOST_ARCH_IA32 | 382 #if V8_HOST_ARCH_IA32 |
| 378 state.pc = reinterpret_cast<Address>(mcontext.__gregs[_REG_EIP]); | 383 state.pc = reinterpret_cast<Address>(mcontext.__gregs[_REG_EIP]); |
| 379 state.sp = reinterpret_cast<Address>(mcontext.__gregs[_REG_ESP]); | 384 state.sp = reinterpret_cast<Address>(mcontext.__gregs[_REG_ESP]); |
| 380 state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_EBP]); | 385 state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_EBP]); |
| 381 #elif V8_HOST_ARCH_X64 | 386 #elif V8_HOST_ARCH_X64 |
| 382 state.pc = reinterpret_cast<Address>(mcontext.__gregs[_REG_RIP]); | 387 state.pc = reinterpret_cast<Address>(mcontext.__gregs[_REG_RIP]); |
| 383 state.sp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RSP]); | 388 state.sp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RSP]); |
| 384 state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RBP]); | 389 state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RBP]); |
| 385 #endif // V8_HOST_ARCH_* | 390 #endif // V8_HOST_ARCH_* |
| 386 #elif defined(__OpenBSD__) | 391 #elif defined(__OpenBSD__) |
| 387 USE(mcontext); | |
| 388 #if V8_HOST_ARCH_IA32 | 392 #if V8_HOST_ARCH_IA32 |
| 389 state.pc = reinterpret_cast<Address>(ucontext->sc_eip); | 393 state.pc = reinterpret_cast<Address>(ucontext->sc_eip); |
| 390 state.sp = reinterpret_cast<Address>(ucontext->sc_esp); | 394 state.sp = reinterpret_cast<Address>(ucontext->sc_esp); |
| 391 state.fp = reinterpret_cast<Address>(ucontext->sc_ebp); | 395 state.fp = reinterpret_cast<Address>(ucontext->sc_ebp); |
| 392 #elif V8_HOST_ARCH_X64 | 396 #elif V8_HOST_ARCH_X64 |
| 393 state.pc = reinterpret_cast<Address>(ucontext->sc_rip); | 397 state.pc = reinterpret_cast<Address>(ucontext->sc_rip); |
| 394 state.sp = reinterpret_cast<Address>(ucontext->sc_rsp); | 398 state.sp = reinterpret_cast<Address>(ucontext->sc_rsp); |
| 395 state.fp = reinterpret_cast<Address>(ucontext->sc_rbp); | 399 state.fp = reinterpret_cast<Address>(ucontext->sc_rbp); |
| 396 #endif // V8_HOST_ARCH_* | 400 #endif // V8_HOST_ARCH_* |
| 397 #elif defined(__sun) | 401 #elif defined(__sun) |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 sample->Init(isolate_, state); | 700 sample->Init(isolate_, state); |
| 697 if (is_counting_samples_) { | 701 if (is_counting_samples_) { |
| 698 if (sample->state == JS || sample->state == EXTERNAL) { | 702 if (sample->state == JS || sample->state == EXTERNAL) { |
| 699 ++js_and_external_sample_count_; | 703 ++js_and_external_sample_count_; |
| 700 } | 704 } |
| 701 } | 705 } |
| 702 Tick(sample); | 706 Tick(sample); |
| 703 } | 707 } |
| 704 | 708 |
| 705 } } // namespace v8::internal | 709 } } // namespace v8::internal |
| OLD | NEW |