Index: runtime/vm/profiler.cc |
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc |
index ddd5b26817bfdea01f4dd4b7ff9d14ba51db6256..d6fcec326812ab1c572fd9cb9ff18c7c12262c26 100644 |
--- a/runtime/vm/profiler.cc |
+++ b/runtime/vm/profiler.cc |
@@ -529,8 +529,9 @@ class ProfilerDartStackWalker : public ProfilerStackWalker { |
return NextExit(); |
} |
uword* new_fp = CallerFP(); |
- if (new_fp <= fp_) { |
- // FP didn't move to a higher address. |
+ if (!IsCalleeFrameOf(reinterpret_cast<uword>(new_fp), |
+ reinterpret_cast<uword>(fp_))) { |
+ // FP didn't move to a caller (higher address on most architectures). |
return false; |
} |
// Success, update fp and pc. |
@@ -859,10 +860,18 @@ static bool GetAndValidateIsolateStackBounds(Thread* thread, |
return false; |
} |
#endif |
+ |
+#if defined(TARGET_ARCH_DBC) |
+ if (!in_dart_code && (sp > *stack_lower)) { |
+ // The stack pointer gives us a tighter lower bound. |
+ *stack_lower = sp; |
+ } |
+#else |
if (sp > *stack_lower) { |
// The stack pointer gives us a tighter lower bound. |
*stack_lower = sp; |
} |
+#endif |
if (*stack_lower >= *stack_upper) { |
// Stack boundary is invalid. |
@@ -1125,11 +1134,6 @@ void Profiler::SampleThreadSingleFrame(Thread* thread, uintptr_t pc) { |
void Profiler::SampleThread(Thread* thread, |
const InterruptedThreadState& state) { |
-#if defined(TARGET_ARCH_DBC) |
- // TODO(vegorov) implement simulator stack sampling. |
- return; |
-#endif |
- |
ASSERT(thread != NULL); |
OSThread* os_thread = thread->os_thread(); |
ASSERT(os_thread != NULL); |
@@ -1155,14 +1159,17 @@ void Profiler::SampleThread(Thread* thread, |
uintptr_t sp = 0; |
uintptr_t fp = state.fp; |
uintptr_t pc = state.pc; |
-#if defined(USING_SIMULATOR) && !defined(TARGET_ARCH_DBC) |
+#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(TARGET_ARCH_DBC) |
- UNIMPLEMENTED(); |
+ simulator = isolate->simulator(); |
+ sp = simulator->get_sp(); |
+ fp = simulator->get_fp(); |
+ pc = simulator->get_pc(); |
#elif defined(USING_SIMULATOR) |
simulator = isolate->simulator(); |
sp = simulator->get_register(SPREG); |