Index: runtime/vm/isolate.cc |
=================================================================== |
--- runtime/vm/isolate.cc (revision 43859) |
+++ runtime/vm/isolate.cc (working copy) |
@@ -624,7 +624,7 @@ |
} |
-Isolate* Isolate::Init(const char* name_prefix) { |
+Isolate* Isolate::Init(const char* name_prefix, bool is_vm_isolate) { |
Isolate* result = new Isolate(); |
ASSERT(result != NULL); |
@@ -654,11 +654,11 @@ |
ASSERT(state != NULL); |
result->set_api_state(state); |
- // Initialize stack top and limit in case we are running the isolate in the |
- // main thread. |
- // TODO(5411455): Need to figure out how to set the stack limit for the |
- // main thread. |
- result->SetStackLimitFromStackBase(reinterpret_cast<uword>(&result)); |
+ // Initialize stack limit (wait until later for the VM isolate, since the |
+ // needed GetStackPointer stub has not yet been generated in that case). |
+ if (!is_vm_isolate) { |
+ result->InitializeStackLimit(); |
+ } |
result->set_main_port(PortMap::CreatePort(result->message_handler())); |
#if defined(DEBUG) |
// Verify that we are never reusing a live origin id. |
@@ -687,6 +687,32 @@ |
} |
+void Isolate::InitializeStackLimit() { |
+ SetStackLimitFromStackBase(Isolate::GetCurrentStackPointer()); |
+} |
+ |
+ |
+/* static */ |
+uword Isolate::GetCurrentStackPointer() { |
+ // Since AddressSanitizer's detect_stack_use_after_return instruments the |
+ // C++ code to give out fake stack addresses, we call a stub in that case. |
+ uword (*func)() = |
+ reinterpret_cast<uword (*)()>(StubCode::GetStackPointerEntryPoint()); |
+ // But for performance (and to support simulators), we normally use a local. |
+ uword stack_allocated_local_address = reinterpret_cast<uword>(&func); |
+#if defined(__has_feature) |
+#if __has_feature(address_sanitizer) |
+ uword current_sp = func(); |
+ return current_sp; |
+#else |
+ return stack_allocated_local_address; |
+#endif |
+#else |
+ return stack_allocated_local_address; |
+#endif |
+} |
+ |
+ |
void Isolate::BuildName(const char* name_prefix) { |
ASSERT(name_ == NULL); |
if (name_prefix == NULL) { |