Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: runtime/vm/isolate.cc

Issue 932983002: To satisfy ASAN, use stub instead of & operator to get C++ stack pointer. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/simulator_arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/isolate.h" 5 #include "vm/isolate.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "platform/json.h" 9 #include "platform/json.h"
10 #include "vm/code_observers.h" 10 #include "vm/code_observers.h"
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 void Isolate::InitOnce() { 617 void Isolate::InitOnce() {
618 ASSERT(isolate_key == OSThread::kUnsetThreadLocalKey); 618 ASSERT(isolate_key == OSThread::kUnsetThreadLocalKey);
619 isolate_key = OSThread::CreateThreadLocal(); 619 isolate_key = OSThread::CreateThreadLocal();
620 ASSERT(isolate_key != OSThread::kUnsetThreadLocalKey); 620 ASSERT(isolate_key != OSThread::kUnsetThreadLocalKey);
621 create_callback_ = NULL; 621 create_callback_ = NULL;
622 isolates_list_monitor_ = new Monitor(); 622 isolates_list_monitor_ = new Monitor();
623 ASSERT(isolates_list_monitor_ != NULL); 623 ASSERT(isolates_list_monitor_ != NULL);
624 } 624 }
625 625
626 626
627 Isolate* Isolate::Init(const char* name_prefix) { 627 Isolate* Isolate::Init(const char* name_prefix, bool is_vm_isolate) {
628 Isolate* result = new Isolate(); 628 Isolate* result = new Isolate();
629 ASSERT(result != NULL); 629 ASSERT(result != NULL);
630 630
631 // Initialize metrics. 631 // Initialize metrics.
632 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \ 632 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \
633 result->metric_##variable##_.Init(result, name, NULL, Metric::unit); 633 result->metric_##variable##_.Init(result, name, NULL, Metric::unit);
634 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT); 634 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT);
635 #undef ISOLATE_METRIC_INIT 635 #undef ISOLATE_METRIC_INIT
636 636
637 // TODO(5411455): For now just set the recently created isolate as 637 // TODO(5411455): For now just set the recently created isolate as
638 // the current isolate. 638 // the current isolate.
639 SetCurrent(result); 639 SetCurrent(result);
640 640
641 // Setup the isolate specific resuable handles. 641 // Setup the isolate specific resuable handles.
642 #define REUSABLE_HANDLE_ALLOCATION(object) \ 642 #define REUSABLE_HANDLE_ALLOCATION(object) \
643 result->object##_handle_ = result->AllocateReusableHandle<object>(); 643 result->object##_handle_ = result->AllocateReusableHandle<object>();
644 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION) 644 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION)
645 #undef REUSABLE_HANDLE_ALLOCATION 645 #undef REUSABLE_HANDLE_ALLOCATION
646 646
647 // Setup the isolate message handler. 647 // Setup the isolate message handler.
648 MessageHandler* handler = new IsolateMessageHandler(result); 648 MessageHandler* handler = new IsolateMessageHandler(result);
649 ASSERT(handler != NULL); 649 ASSERT(handler != NULL);
650 result->set_message_handler(handler); 650 result->set_message_handler(handler);
651 651
652 // Setup the Dart API state. 652 // Setup the Dart API state.
653 ApiState* state = new ApiState(); 653 ApiState* state = new ApiState();
654 ASSERT(state != NULL); 654 ASSERT(state != NULL);
655 result->set_api_state(state); 655 result->set_api_state(state);
656 656
657 // Initialize stack top and limit in case we are running the isolate in the 657 // Initialize stack limit (wait until later for the VM isolate, since the
658 // main thread. 658 // needed GetStackPointer stub has not yet been generated in that case).
659 // TODO(5411455): Need to figure out how to set the stack limit for the 659 if (!is_vm_isolate) {
660 // main thread. 660 result->InitializeStackLimit();
661 result->SetStackLimitFromStackBase(reinterpret_cast<uword>(&result)); 661 }
662 result->set_main_port(PortMap::CreatePort(result->message_handler())); 662 result->set_main_port(PortMap::CreatePort(result->message_handler()));
663 #if defined(DEBUG) 663 #if defined(DEBUG)
664 // Verify that we are never reusing a live origin id. 664 // Verify that we are never reusing a live origin id.
665 VerifyOriginId id_verifier(result->main_port()); 665 VerifyOriginId id_verifier(result->main_port());
666 Isolate::VisitIsolates(&id_verifier); 666 Isolate::VisitIsolates(&id_verifier);
667 #endif 667 #endif
668 result->set_origin_id(result->main_port()); 668 result->set_origin_id(result->main_port());
669 result->set_pause_capability(result->random()->NextUInt64()); 669 result->set_pause_capability(result->random()->NextUInt64());
670 result->set_terminate_capability(result->random()->NextUInt64()); 670 result->set_terminate_capability(result->random()->NextUInt64());
671 671
672 result->BuildName(name_prefix); 672 result->BuildName(name_prefix);
673 673
674 result->debugger_ = new Debugger(); 674 result->debugger_ = new Debugger();
675 result->debugger_->Initialize(result); 675 result->debugger_->Initialize(result);
676 if (FLAG_trace_isolates) { 676 if (FLAG_trace_isolates) {
677 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { 677 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) {
678 OS::Print("[+] Starting isolate:\n" 678 OS::Print("[+] Starting isolate:\n"
679 "\tisolate: %s\n", result->name()); 679 "\tisolate: %s\n", result->name());
680 } 680 }
681 } 681 }
682 682
683 // Add to isolate list. 683 // Add to isolate list.
684 AddIsolateTolist(result); 684 AddIsolateTolist(result);
685 685
686 return result; 686 return result;
687 } 687 }
688 688
689 689
690 void Isolate::InitializeStackLimit() {
691 SetStackLimitFromStackBase(Isolate::GetCurrentStackPointer());
692 }
693
694
695 /* static */
696 uword Isolate::GetCurrentStackPointer() {
697 // Since AddressSanitizer's detect_stack_use_after_return instruments the
698 // C++ code to give out fake stack addresses, we call a stub in that case.
699 uword (*func)() =
700 reinterpret_cast<uword (*)()>(StubCode::GetStackPointerEntryPoint());
701 // But for performance (and to support simulators), we normally use a local.
702 uword stack_allocated_local_address = reinterpret_cast<uword>(&func);
703 #if defined(__has_feature)
704 #if __has_feature(address_sanitizer)
705 uword current_sp = func();
706 return current_sp;
707 #else
708 return stack_allocated_local_address;
709 #endif
710 #else
711 return stack_allocated_local_address;
712 #endif
713 }
714
715
690 void Isolate::BuildName(const char* name_prefix) { 716 void Isolate::BuildName(const char* name_prefix) {
691 ASSERT(name_ == NULL); 717 ASSERT(name_ == NULL);
692 if (name_prefix == NULL) { 718 if (name_prefix == NULL) {
693 name_prefix = "isolate"; 719 name_prefix = "isolate";
694 } 720 }
695 if (ServiceIsolate::NameEquals(name_prefix)) { 721 if (ServiceIsolate::NameEquals(name_prefix)) {
696 name_ = strdup(name_prefix); 722 name_ = strdup(name_prefix);
697 return; 723 return;
698 } 724 }
699 const char* kFormat = "%s-%lld"; 725 const char* kFormat = "%s-%lld";
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
1673 serialized_message_, serialized_message_len_); 1699 serialized_message_, serialized_message_len_);
1674 } 1700 }
1675 1701
1676 1702
1677 void IsolateSpawnState::Cleanup() { 1703 void IsolateSpawnState::Cleanup() {
1678 SwitchIsolateScope switch_scope(I); 1704 SwitchIsolateScope switch_scope(I);
1679 Dart::ShutdownIsolate(); 1705 Dart::ShutdownIsolate();
1680 } 1706 }
1681 1707
1682 } // namespace dart 1708 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/simulator_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698