| Index: src/sampler.cc
|
| diff --git a/src/sampler.cc b/src/sampler.cc
|
| index 394efeb7640764870b6f768a9d11a1b879955416..6ffaf1c7668c054c28f5529ad1a742e188759dd8 100644
|
| --- a/src/sampler.cc
|
| +++ b/src/sampler.cc
|
| @@ -232,7 +232,7 @@ class SimulatorHelper {
|
| return simulator_ != NULL;
|
| }
|
|
|
| - inline void FillRegisters(RegisterState* state) {
|
| + inline void FillRegisters(v8::RegisterState* state) {
|
| #if V8_TARGET_ARCH_ARM
|
| state->pc = reinterpret_cast<Address>(simulator_->get_pc());
|
| state->sp = reinterpret_cast<Address>(simulator_->get_register(
|
| @@ -353,9 +353,9 @@ void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info,
|
| Sampler* sampler = isolate->logger()->sampler();
|
| if (sampler == NULL) return;
|
|
|
| - RegisterState state;
|
|
|
| #if defined(USE_SIMULATOR)
|
| + v8::RegisterState state;
|
| SimulatorHelper helper;
|
| if (!helper.Init(sampler, isolate)) return;
|
| helper.FillRegisters(&state);
|
| @@ -365,119 +365,8 @@ void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info,
|
| // Bailout if sp/fp doesn't contain the new value.
|
| if (state.sp == 0 || state.fp == 0) return;
|
| #else
|
| - // Extracting the sample from the context is extremely machine dependent.
|
| ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context);
|
| -#if !V8_OS_OPENBSD
|
| - mcontext_t& mcontext = ucontext->uc_mcontext;
|
| -#endif
|
| -#if V8_OS_LINUX
|
| -#if V8_HOST_ARCH_IA32
|
| - state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_EIP]);
|
| - state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_ESP]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_EBP]);
|
| -#elif V8_HOST_ARCH_X64
|
| - state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_RIP]);
|
| - state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_RSP]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_RBP]);
|
| -#elif V8_HOST_ARCH_ARM
|
| -#if defined(__GLIBC__) && !defined(__UCLIBC__) && \
|
| - (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
|
| - // Old GLibc ARM versions used a gregs[] array to access the register
|
| - // values from mcontext_t.
|
| - state.pc = reinterpret_cast<Address>(mcontext.gregs[R15]);
|
| - state.sp = reinterpret_cast<Address>(mcontext.gregs[R13]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.gregs[R11]);
|
| -#else
|
| - state.pc = reinterpret_cast<Address>(mcontext.arm_pc);
|
| - state.sp = reinterpret_cast<Address>(mcontext.arm_sp);
|
| - state.fp = reinterpret_cast<Address>(mcontext.arm_fp);
|
| -#endif // defined(__GLIBC__) && !defined(__UCLIBC__) &&
|
| - // (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
|
| -#elif V8_HOST_ARCH_ARM64
|
| - state.pc = reinterpret_cast<Address>(mcontext.pc);
|
| - state.sp = reinterpret_cast<Address>(mcontext.sp);
|
| - // FP is an alias for x29.
|
| - state.fp = reinterpret_cast<Address>(mcontext.regs[29]);
|
| -#elif V8_HOST_ARCH_MIPS
|
| - state.pc = reinterpret_cast<Address>(mcontext.pc);
|
| - state.sp = reinterpret_cast<Address>(mcontext.gregs[29]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.gregs[30]);
|
| -#elif V8_HOST_ARCH_MIPS64
|
| - state.pc = reinterpret_cast<Address>(mcontext.pc);
|
| - state.sp = reinterpret_cast<Address>(mcontext.gregs[29]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.gregs[30]);
|
| -#endif // V8_HOST_ARCH_*
|
| -#elif V8_OS_MACOSX
|
| -#if V8_HOST_ARCH_X64
|
| -#if __DARWIN_UNIX03
|
| - state.pc = reinterpret_cast<Address>(mcontext->__ss.__rip);
|
| - state.sp = reinterpret_cast<Address>(mcontext->__ss.__rsp);
|
| - state.fp = reinterpret_cast<Address>(mcontext->__ss.__rbp);
|
| -#else // !__DARWIN_UNIX03
|
| - state.pc = reinterpret_cast<Address>(mcontext->ss.rip);
|
| - state.sp = reinterpret_cast<Address>(mcontext->ss.rsp);
|
| - state.fp = reinterpret_cast<Address>(mcontext->ss.rbp);
|
| -#endif // __DARWIN_UNIX03
|
| -#elif V8_HOST_ARCH_IA32
|
| -#if __DARWIN_UNIX03
|
| - state.pc = reinterpret_cast<Address>(mcontext->__ss.__eip);
|
| - state.sp = reinterpret_cast<Address>(mcontext->__ss.__esp);
|
| - state.fp = reinterpret_cast<Address>(mcontext->__ss.__ebp);
|
| -#else // !__DARWIN_UNIX03
|
| - state.pc = reinterpret_cast<Address>(mcontext->ss.eip);
|
| - state.sp = reinterpret_cast<Address>(mcontext->ss.esp);
|
| - state.fp = reinterpret_cast<Address>(mcontext->ss.ebp);
|
| -#endif // __DARWIN_UNIX03
|
| -#endif // V8_HOST_ARCH_IA32
|
| -#elif V8_OS_FREEBSD
|
| -#if V8_HOST_ARCH_IA32
|
| - state.pc = reinterpret_cast<Address>(mcontext.mc_eip);
|
| - state.sp = reinterpret_cast<Address>(mcontext.mc_esp);
|
| - state.fp = reinterpret_cast<Address>(mcontext.mc_ebp);
|
| -#elif V8_HOST_ARCH_X64
|
| - state.pc = reinterpret_cast<Address>(mcontext.mc_rip);
|
| - state.sp = reinterpret_cast<Address>(mcontext.mc_rsp);
|
| - state.fp = reinterpret_cast<Address>(mcontext.mc_rbp);
|
| -#elif V8_HOST_ARCH_ARM
|
| - state.pc = reinterpret_cast<Address>(mcontext.mc_r15);
|
| - state.sp = reinterpret_cast<Address>(mcontext.mc_r13);
|
| - state.fp = reinterpret_cast<Address>(mcontext.mc_r11);
|
| -#endif // V8_HOST_ARCH_*
|
| -#elif V8_OS_NETBSD
|
| -#if V8_HOST_ARCH_IA32
|
| - state.pc = reinterpret_cast<Address>(mcontext.__gregs[_REG_EIP]);
|
| - state.sp = reinterpret_cast<Address>(mcontext.__gregs[_REG_ESP]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_EBP]);
|
| -#elif V8_HOST_ARCH_X64
|
| - state.pc = reinterpret_cast<Address>(mcontext.__gregs[_REG_RIP]);
|
| - state.sp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RSP]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RBP]);
|
| -#endif // V8_HOST_ARCH_*
|
| -#elif V8_OS_OPENBSD
|
| -#if V8_HOST_ARCH_IA32
|
| - state.pc = reinterpret_cast<Address>(ucontext->sc_eip);
|
| - state.sp = reinterpret_cast<Address>(ucontext->sc_esp);
|
| - state.fp = reinterpret_cast<Address>(ucontext->sc_ebp);
|
| -#elif V8_HOST_ARCH_X64
|
| - state.pc = reinterpret_cast<Address>(ucontext->sc_rip);
|
| - state.sp = reinterpret_cast<Address>(ucontext->sc_rsp);
|
| - state.fp = reinterpret_cast<Address>(ucontext->sc_rbp);
|
| -#endif // V8_HOST_ARCH_*
|
| -#elif V8_OS_SOLARIS
|
| - state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_PC]);
|
| - state.sp = reinterpret_cast<Address>(mcontext.gregs[REG_SP]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.gregs[REG_FP]);
|
| -#elif V8_OS_QNX
|
| -#if V8_HOST_ARCH_IA32
|
| - state.pc = reinterpret_cast<Address>(mcontext.cpu.eip);
|
| - state.sp = reinterpret_cast<Address>(mcontext.cpu.esp);
|
| - state.fp = reinterpret_cast<Address>(mcontext.cpu.ebp);
|
| -#elif V8_HOST_ARCH_ARM
|
| - state.pc = reinterpret_cast<Address>(mcontext.cpu.gpr[ARM_REG_PC]);
|
| - state.sp = reinterpret_cast<Address>(mcontext.cpu.gpr[ARM_REG_SP]);
|
| - state.fp = reinterpret_cast<Address>(mcontext.cpu.gpr[ARM_REG_FP]);
|
| -#endif // V8_HOST_ARCH_*
|
| -#endif // V8_OS_QNX
|
| + v8::RegisterState state(*ucontext);
|
| #endif // USE_SIMULATOR
|
| sampler->SampleStack(state);
|
| }
|
| @@ -577,10 +466,10 @@ SamplerThread* SamplerThread::instance_ = NULL;
|
| // StackTracer implementation
|
| //
|
| DISABLE_ASAN void TickSample::Init(Isolate* isolate,
|
| - const RegisterState& regs) {
|
| + const v8::RegisterState& regs) {
|
| DCHECK(isolate->IsInitialized());
|
| timestamp = base::TimeTicks::HighResolutionNow();
|
| - pc = regs.pc;
|
| + pc = reinterpret_cast<Address>(regs.pc);
|
| state = isolate->current_vm_state();
|
|
|
| // Avoid collecting traces while doing GC.
|
| @@ -603,11 +492,12 @@ DISABLE_ASAN void TickSample::Init(Isolate* isolate,
|
| } else {
|
| // Sample potential return address value for frameless invocation of
|
| // stubs (we'll figure out later, if this value makes sense).
|
| - tos = Memory::Address_at(regs.sp);
|
| + tos = Memory::Address_at(reinterpret_cast<Address>(regs.sp));
|
| has_external_callback = false;
|
| }
|
|
|
| - SafeStackFrameIterator it(isolate, regs.fp, regs.sp, js_entry_sp);
|
| + SafeStackFrameIterator it(isolate, reinterpret_cast<Address>(regs.fp),
|
| + reinterpret_cast<Address>(regs.sp), js_entry_sp);
|
| top_frame_type = it.top_frame_type();
|
| unsigned i = 0;
|
| while (!it.done() && i < TickSample::kMaxFramesCount) {
|
| @@ -682,7 +572,7 @@ void Sampler::DecreaseProfilingDepth() {
|
| }
|
|
|
|
|
| -void Sampler::SampleStack(const RegisterState& state) {
|
| +void Sampler::SampleStack(const v8::RegisterState& state) {
|
| TickSample* sample = isolate_->cpu_profiler()->StartTickSample();
|
| TickSample sample_obj;
|
| if (sample == NULL) sample = &sample_obj;
|
| @@ -725,20 +615,12 @@ void Sampler::DoSample() {
|
| memset(&context, 0, sizeof(context));
|
| context.ContextFlags = CONTEXT_FULL;
|
| if (GetThreadContext(profiled_thread, &context) != 0) {
|
| - RegisterState state;
|
| #if defined(USE_SIMULATOR)
|
| + v8::RegisterState state;
|
| helper.FillRegisters(&state);
|
| #else
|
| -#if V8_HOST_ARCH_X64
|
| - state.pc = reinterpret_cast<Address>(context.Rip);
|
| - state.sp = reinterpret_cast<Address>(context.Rsp);
|
| - state.fp = reinterpret_cast<Address>(context.Rbp);
|
| -#else
|
| - state.pc = reinterpret_cast<Address>(context.Eip);
|
| - state.sp = reinterpret_cast<Address>(context.Esp);
|
| - state.fp = reinterpret_cast<Address>(context.Ebp);
|
| + v8::RegisterState state(context);
|
| #endif
|
| -#endif // USE_SIMULATOR
|
| SampleStack(state);
|
| }
|
| ResumeThread(profiled_thread);
|
|
|