| Index: runtime/vm/profiler.cc
|
| ===================================================================
|
| --- runtime/vm/profiler.cc (revision 45418)
|
| +++ runtime/vm/profiler.cc (working copy)
|
| @@ -954,10 +954,24 @@
|
| (isolate->vm_tag() == VMTag::kDartTagId);
|
|
|
| uintptr_t sp = 0;
|
| + uintptr_t fp = state.fp;
|
| + uintptr_t pc = state.pc;
|
| + uintptr_t lr = state.lr;
|
| +#if defined(USING_SIMULATOR)
|
| + Simulator* simulator = NULL;
|
| +#endif
|
|
|
| if (in_dart_code) {
|
| // If we're in Dart code, use the Dart stack pointer.
|
| +#if defined(USING_SIMULATOR)
|
| + simulator = isolate->simulator();
|
| + sp = simulator->get_register(SPREG);
|
| + fp = simulator->get_register(FPREG);
|
| + pc = simulator->get_pc();
|
| + lr = simulator->get_register(LRREG);
|
| +#else
|
| sp = state.dsp;
|
| +#endif
|
| } else {
|
| // If we're in runtime code, use the C stack pointer.
|
| sp = state.csp;
|
| @@ -975,18 +989,18 @@
|
| return;
|
| }
|
|
|
| - if ((sp == 0) || (state.fp == 0) || (state.pc == 0)) {
|
| + if ((sp == 0) || (fp == 0) || (pc == 0)) {
|
| // None of these registers should be zero.
|
| return;
|
| }
|
|
|
| - if (sp > state.fp) {
|
| + if (sp > fp) {
|
| // Assuming the stack grows down, we should never have a stack pointer above
|
| // the frame pointer.
|
| return;
|
| }
|
|
|
| - if (StubCode::InJumpToExceptionHandlerStub(state.pc)) {
|
| + if (StubCode::InJumpToExceptionHandlerStub(pc)) {
|
| // The JumpToExceptionHandler stub manually adjusts the stack pointer,
|
| // frame pointer, and some isolate state before jumping to a catch entry.
|
| // It is not safe to walk the stack when executing this stub.
|
| @@ -995,11 +1009,24 @@
|
|
|
| uword stack_lower = 0;
|
| uword stack_upper = 0;
|
| +#if defined(USING_SIMULATOR)
|
| + if (in_dart_code) {
|
| + stack_lower = simulator->StackBase();
|
| + stack_upper = simulator->StackTop();
|
| + } else if (!isolate->GetProfilerStackBounds(&stack_lower, &stack_upper)) {
|
| + // Could not get stack boundary.
|
| + return;
|
| + }
|
| + if ((stack_lower == 0) || (stack_upper == 0)) {
|
| + return;
|
| + }
|
| +#else
|
| if (!isolate->GetProfilerStackBounds(&stack_lower, &stack_upper) ||
|
| (stack_lower == 0) || (stack_upper == 0)) {
|
| // Could not get stack boundary.
|
| return;
|
| }
|
| +#endif
|
|
|
| if (sp > stack_lower) {
|
| // The stack pointer gives us a tighter lower bound.
|
| @@ -1016,7 +1043,7 @@
|
| return;
|
| }
|
|
|
| - if ((state.fp < stack_lower) || (state.fp >= stack_upper)) {
|
| + if ((fp < stack_lower) || (fp >= stack_upper)) {
|
| // Frame pointer is outside isolate stack boundary.
|
| return;
|
| }
|
| @@ -1044,8 +1071,8 @@
|
| sample->set_vm_tag(vm_tag);
|
| sample->set_user_tag(isolate->user_tag());
|
| sample->set_sp(sp);
|
| - sample->set_fp(state.fp);
|
| - sample->set_lr(state.lr);
|
| + sample->set_fp(fp);
|
| + sample->set_lr(lr);
|
| CopyStackBuffer(sample);
|
| CopyPCMarkerIfSafe(sample);
|
|
|
| @@ -1054,8 +1081,8 @@
|
| ProfilerNativeStackWalker stackWalker(sample,
|
| stack_lower,
|
| stack_upper,
|
| - state.pc,
|
| - state.fp,
|
| + pc,
|
| + fp,
|
| sp);
|
| stackWalker.walk();
|
| } else if (exited_dart_code) {
|
| @@ -1068,13 +1095,13 @@
|
| sample,
|
| stack_lower,
|
| stack_upper,
|
| - state.pc,
|
| - state.fp,
|
| + pc,
|
| + fp,
|
| sp);
|
| stackWalker.walk();
|
| } else {
|
| sample->set_vm_tag(VMTag::kEmbedderTagId);
|
| - sample->SetAt(0, state.pc);
|
| + sample->SetAt(0, pc);
|
| }
|
| }
|
|
|
|
|