OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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/clustered_snapshot.h" | 5 #include "vm/clustered_snapshot.h" |
6 | 6 |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
8 #include "vm/bootstrap.h" | 8 #include "vm/bootstrap.h" |
9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 | 508 |
509 void Trace(Serializer* s, RawObject* object) { | 509 void Trace(Serializer* s, RawObject* object) { |
510 RawFunction* func = Function::RawCast(object); | 510 RawFunction* func = Function::RawCast(object); |
511 objects_.Add(func); | 511 objects_.Add(func); |
512 | 512 |
513 RawObject** from = func->from(); | 513 RawObject** from = func->from(); |
514 RawObject** to = func->to_snapshot(); | 514 RawObject** to = func->to_snapshot(); |
515 for (RawObject** p = from; p <= to; p++) { | 515 for (RawObject** p = from; p <= to; p++) { |
516 s->Push(*p); | 516 s->Push(*p); |
517 } | 517 } |
518 if (s->kind() == Snapshot::kAppNoJIT) { | 518 if (s->kind() == Snapshot::kAppAOT) { |
519 s->Push(func->ptr()->code_); | 519 s->Push(func->ptr()->code_); |
520 } else if (s->kind() == Snapshot::kAppWithJIT) { | 520 } else if (s->kind() == Snapshot::kAppJIT) { |
521 NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_)); | 521 NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_)); |
522 s->Push(func->ptr()->code_); | 522 s->Push(func->ptr()->code_); |
523 s->Push(func->ptr()->ic_data_array_); | 523 s->Push(func->ptr()->ic_data_array_); |
524 } | 524 } |
525 } | 525 } |
526 | 526 |
527 void WriteAlloc(Serializer* s) { | 527 void WriteAlloc(Serializer* s) { |
528 s->WriteCid(kFunctionCid); | 528 s->WriteCid(kFunctionCid); |
529 intptr_t count = objects_.length(); | 529 intptr_t count = objects_.length(); |
530 s->Write<int32_t>(count); | 530 s->Write<int32_t>(count); |
531 for (intptr_t i = 0; i < count; i++) { | 531 for (intptr_t i = 0; i < count; i++) { |
532 RawFunction* func = objects_[i]; | 532 RawFunction* func = objects_[i]; |
533 s->AssignRef(func); | 533 s->AssignRef(func); |
534 } | 534 } |
535 } | 535 } |
536 | 536 |
537 void WriteFill(Serializer* s) { | 537 void WriteFill(Serializer* s) { |
538 Snapshot::Kind kind = s->kind(); | 538 Snapshot::Kind kind = s->kind(); |
539 intptr_t count = objects_.length(); | 539 intptr_t count = objects_.length(); |
540 for (intptr_t i = 0; i < count; i++) { | 540 for (intptr_t i = 0; i < count; i++) { |
541 RawFunction* func = objects_[i]; | 541 RawFunction* func = objects_[i]; |
542 RawObject** from = func->from(); | 542 RawObject** from = func->from(); |
543 RawObject** to = func->to_snapshot(); | 543 RawObject** to = func->to_snapshot(); |
544 for (RawObject** p = from; p <= to; p++) { | 544 for (RawObject** p = from; p <= to; p++) { |
545 s->WriteRef(*p); | 545 s->WriteRef(*p); |
546 } | 546 } |
547 if (kind == Snapshot::kAppNoJIT) { | 547 if (kind == Snapshot::kAppAOT) { |
548 s->WriteRef(func->ptr()->code_); | 548 s->WriteRef(func->ptr()->code_); |
549 } else if (s->kind() == Snapshot::kAppWithJIT) { | 549 } else if (s->kind() == Snapshot::kAppJIT) { |
550 NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->unoptimized_code_)); | 550 NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->unoptimized_code_)); |
551 s->WriteRef(func->ptr()->code_); | 551 s->WriteRef(func->ptr()->code_); |
552 s->WriteRef(func->ptr()->ic_data_array_); | 552 s->WriteRef(func->ptr()->ic_data_array_); |
553 } | 553 } |
554 | 554 |
555 #if !defined(DART_PRECOMPILED_RUNTIME) | 555 #if !defined(DART_PRECOMPILED_RUNTIME) |
556 if (kind != Snapshot::kAppNoJIT) { | 556 if (kind != Snapshot::kAppAOT) { |
557 s->WriteTokenPosition(func->ptr()->token_pos_); | 557 s->WriteTokenPosition(func->ptr()->token_pos_); |
558 s->WriteTokenPosition(func->ptr()->end_token_pos_); | 558 s->WriteTokenPosition(func->ptr()->end_token_pos_); |
559 } | 559 } |
560 #endif | 560 #endif |
561 s->Write<int16_t>(func->ptr()->num_fixed_parameters_); | 561 s->Write<int16_t>(func->ptr()->num_fixed_parameters_); |
562 s->Write<int16_t>(func->ptr()->num_optional_parameters_); | 562 s->Write<int16_t>(func->ptr()->num_optional_parameters_); |
563 s->Write<uint32_t>(func->ptr()->kind_tag_); | 563 s->Write<uint32_t>(func->ptr()->kind_tag_); |
564 if (kind == Snapshot::kAppNoJIT) { | 564 if (kind == Snapshot::kAppAOT) { |
565 // Omit fields used to support de/reoptimization. | 565 // Omit fields used to support de/reoptimization. |
566 } else if (!Snapshot::IncludesCode(kind)) { | 566 } else if (!Snapshot::IncludesCode(kind)) { |
567 #if !defined(DART_PRECOMPILED_RUNTIME) | 567 #if !defined(DART_PRECOMPILED_RUNTIME) |
568 bool is_optimized = Code::IsOptimized(func->ptr()->code_); | 568 bool is_optimized = Code::IsOptimized(func->ptr()->code_); |
569 if (is_optimized) { | 569 if (is_optimized) { |
570 s->Write<int32_t>(FLAG_optimization_counter_threshold); | 570 s->Write<int32_t>(FLAG_optimization_counter_threshold); |
571 } else { | 571 } else { |
572 s->Write<int32_t>(0); | 572 s->Write<int32_t>(0); |
573 } | 573 } |
574 #endif | 574 #endif |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 Function::InstanceSize(), is_vm_object); | 607 Function::InstanceSize(), is_vm_object); |
608 RawObject** from = func->from(); | 608 RawObject** from = func->from(); |
609 RawObject** to_snapshot = func->to_snapshot(); | 609 RawObject** to_snapshot = func->to_snapshot(); |
610 RawObject** to = func->to(); | 610 RawObject** to = func->to(); |
611 for (RawObject** p = from; p <= to_snapshot; p++) { | 611 for (RawObject** p = from; p <= to_snapshot; p++) { |
612 *p = d->ReadRef(); | 612 *p = d->ReadRef(); |
613 } | 613 } |
614 for (RawObject** p = to_snapshot + 1; p <= to; p++) { | 614 for (RawObject** p = to_snapshot + 1; p <= to; p++) { |
615 *p = Object::null(); | 615 *p = Object::null(); |
616 } | 616 } |
617 if (kind == Snapshot::kAppNoJIT) { | 617 if (kind == Snapshot::kAppAOT) { |
618 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef()); | 618 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef()); |
619 } else if (kind == Snapshot::kAppWithJIT) { | 619 } else if (kind == Snapshot::kAppJIT) { |
620 NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ = | 620 NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ = |
621 reinterpret_cast<RawCode*>(d->ReadRef())); | 621 reinterpret_cast<RawCode*>(d->ReadRef())); |
622 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef()); | 622 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef()); |
623 func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef()); | 623 func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef()); |
624 } | 624 } |
625 | 625 |
626 #if defined(DEBUG) | 626 #if defined(DEBUG) |
627 func->ptr()->entry_point_ = 0; | 627 func->ptr()->entry_point_ = 0; |
628 #endif | 628 #endif |
629 | 629 |
630 #if !defined(DART_PRECOMPILED_RUNTIME) | 630 #if !defined(DART_PRECOMPILED_RUNTIME) |
631 if (kind != Snapshot::kAppNoJIT) { | 631 if (kind != Snapshot::kAppAOT) { |
632 func->ptr()->token_pos_ = d->ReadTokenPosition(); | 632 func->ptr()->token_pos_ = d->ReadTokenPosition(); |
633 func->ptr()->end_token_pos_ = d->ReadTokenPosition(); | 633 func->ptr()->end_token_pos_ = d->ReadTokenPosition(); |
634 } | 634 } |
635 #endif | 635 #endif |
636 func->ptr()->num_fixed_parameters_ = d->Read<int16_t>(); | 636 func->ptr()->num_fixed_parameters_ = d->Read<int16_t>(); |
637 func->ptr()->num_optional_parameters_ = d->Read<int16_t>(); | 637 func->ptr()->num_optional_parameters_ = d->Read<int16_t>(); |
638 func->ptr()->kind_tag_ = d->Read<uint32_t>(); | 638 func->ptr()->kind_tag_ = d->Read<uint32_t>(); |
639 if (kind == Snapshot::kAppNoJIT) { | 639 if (kind == Snapshot::kAppAOT) { |
640 // Omit fields used to support de/reoptimization. | 640 // Omit fields used to support de/reoptimization. |
641 } else { | 641 } else { |
642 #if !defined(DART_PRECOMPILED_RUNTIME) | 642 #if !defined(DART_PRECOMPILED_RUNTIME) |
643 if (Snapshot::IncludesCode(kind)) { | 643 if (Snapshot::IncludesCode(kind)) { |
644 func->ptr()->usage_counter_ = 0; | 644 func->ptr()->usage_counter_ = 0; |
645 } else { | 645 } else { |
646 func->ptr()->usage_counter_ = d->Read<int32_t>(); | 646 func->ptr()->usage_counter_ = d->Read<int32_t>(); |
647 } | 647 } |
648 func->ptr()->deoptimization_counter_ = 0; | 648 func->ptr()->deoptimization_counter_ = 0; |
649 func->ptr()->optimized_instruction_count_ = 0; | 649 func->ptr()->optimized_instruction_count_ = 0; |
650 func->ptr()->optimized_call_site_count_ = 0; | 650 func->ptr()->optimized_call_site_count_ = 0; |
651 #endif | 651 #endif |
652 } | 652 } |
653 } | 653 } |
654 } | 654 } |
655 | 655 |
656 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) { | 656 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) { |
657 NOT_IN_PRODUCT(TimelineDurationScope tds( | 657 NOT_IN_PRODUCT(TimelineDurationScope tds( |
658 Thread::Current(), Timeline::GetIsolateStream(), "PostLoadFunction")); | 658 Thread::Current(), Timeline::GetIsolateStream(), "PostLoadFunction")); |
659 | 659 |
660 if (kind == Snapshot::kAppNoJIT) { | 660 if (kind == Snapshot::kAppAOT) { |
661 Function& func = Function::Handle(zone); | 661 Function& func = Function::Handle(zone); |
662 for (intptr_t i = start_index_; i < stop_index_; i++) { | 662 for (intptr_t i = start_index_; i < stop_index_; i++) { |
663 func ^= refs.At(i); | 663 func ^= refs.At(i); |
664 ASSERT(func.raw()->ptr()->code_->IsCode()); | 664 ASSERT(func.raw()->ptr()->code_->IsCode()); |
665 uword entry_point = func.raw()->ptr()->code_->ptr()->entry_point_; | 665 uword entry_point = func.raw()->ptr()->code_->ptr()->entry_point_; |
666 ASSERT(entry_point != 0); | 666 ASSERT(entry_point != 0); |
667 func.raw()->ptr()->entry_point_ = entry_point; | 667 func.raw()->ptr()->entry_point_ = entry_point; |
668 } | 668 } |
669 } else if (kind == Snapshot::kAppWithJIT) { | 669 } else if (kind == Snapshot::kAppJIT) { |
670 Function& func = Function::Handle(zone); | 670 Function& func = Function::Handle(zone); |
671 Code& code = Code::Handle(zone); | 671 Code& code = Code::Handle(zone); |
672 for (intptr_t i = start_index_; i < stop_index_; i++) { | 672 for (intptr_t i = start_index_; i < stop_index_; i++) { |
673 func ^= refs.At(i); | 673 func ^= refs.At(i); |
674 code ^= func.CurrentCode(); | 674 code ^= func.CurrentCode(); |
675 if (func.HasCode() && !code.IsDisabled()) { | 675 if (func.HasCode() && !code.IsDisabled()) { |
676 func.SetInstructions(code); | 676 func.SetInstructions(code); |
677 func.set_was_compiled(true); | 677 func.set_was_compiled(true); |
678 } else { | 678 } else { |
679 func.ClearCode(); | 679 func.ClearCode(); |
(...skipping 16 matching lines...) Expand all Loading... |
696 #if !defined(DART_PRECOMPILED_RUNTIME) | 696 #if !defined(DART_PRECOMPILED_RUNTIME) |
697 class ClosureDataSerializationCluster : public SerializationCluster { | 697 class ClosureDataSerializationCluster : public SerializationCluster { |
698 public: | 698 public: |
699 ClosureDataSerializationCluster() {} | 699 ClosureDataSerializationCluster() {} |
700 virtual ~ClosureDataSerializationCluster() {} | 700 virtual ~ClosureDataSerializationCluster() {} |
701 | 701 |
702 void Trace(Serializer* s, RawObject* object) { | 702 void Trace(Serializer* s, RawObject* object) { |
703 RawClosureData* data = ClosureData::RawCast(object); | 703 RawClosureData* data = ClosureData::RawCast(object); |
704 objects_.Add(data); | 704 objects_.Add(data); |
705 | 705 |
706 if (s->kind() != Snapshot::kAppNoJIT) { | 706 if (s->kind() != Snapshot::kAppAOT) { |
707 s->Push(data->ptr()->context_scope_); | 707 s->Push(data->ptr()->context_scope_); |
708 } | 708 } |
709 s->Push(data->ptr()->parent_function_); | 709 s->Push(data->ptr()->parent_function_); |
710 s->Push(data->ptr()->signature_type_); | 710 s->Push(data->ptr()->signature_type_); |
711 s->Push(data->ptr()->closure_); | 711 s->Push(data->ptr()->closure_); |
712 } | 712 } |
713 | 713 |
714 void WriteAlloc(Serializer* s) { | 714 void WriteAlloc(Serializer* s) { |
715 s->WriteCid(kClosureDataCid); | 715 s->WriteCid(kClosureDataCid); |
716 intptr_t count = objects_.length(); | 716 intptr_t count = objects_.length(); |
717 s->Write<int32_t>(count); | 717 s->Write<int32_t>(count); |
718 for (intptr_t i = 0; i < count; i++) { | 718 for (intptr_t i = 0; i < count; i++) { |
719 RawClosureData* data = objects_[i]; | 719 RawClosureData* data = objects_[i]; |
720 s->AssignRef(data); | 720 s->AssignRef(data); |
721 } | 721 } |
722 } | 722 } |
723 | 723 |
724 void WriteFill(Serializer* s) { | 724 void WriteFill(Serializer* s) { |
725 intptr_t count = objects_.length(); | 725 intptr_t count = objects_.length(); |
726 for (intptr_t i = 0; i < count; i++) { | 726 for (intptr_t i = 0; i < count; i++) { |
727 RawClosureData* data = objects_[i]; | 727 RawClosureData* data = objects_[i]; |
728 if (s->kind() != Snapshot::kAppNoJIT) { | 728 if (s->kind() != Snapshot::kAppAOT) { |
729 s->WriteRef(data->ptr()->context_scope_); | 729 s->WriteRef(data->ptr()->context_scope_); |
730 } | 730 } |
731 s->WriteRef(data->ptr()->parent_function_); | 731 s->WriteRef(data->ptr()->parent_function_); |
732 s->WriteRef(data->ptr()->signature_type_); | 732 s->WriteRef(data->ptr()->signature_type_); |
733 s->WriteRef(data->ptr()->closure_); | 733 s->WriteRef(data->ptr()->closure_); |
734 } | 734 } |
735 } | 735 } |
736 | 736 |
737 private: | 737 private: |
738 GrowableArray<RawClosureData*> objects_; | 738 GrowableArray<RawClosureData*> objects_; |
(...skipping 17 matching lines...) Expand all Loading... |
756 stop_index_ = d->next_index(); | 756 stop_index_ = d->next_index(); |
757 } | 757 } |
758 | 758 |
759 void ReadFill(Deserializer* d) { | 759 void ReadFill(Deserializer* d) { |
760 bool is_vm_object = d->isolate() == Dart::vm_isolate(); | 760 bool is_vm_object = d->isolate() == Dart::vm_isolate(); |
761 | 761 |
762 for (intptr_t id = start_index_; id < stop_index_; id++) { | 762 for (intptr_t id = start_index_; id < stop_index_; id++) { |
763 RawClosureData* data = reinterpret_cast<RawClosureData*>(d->Ref(id)); | 763 RawClosureData* data = reinterpret_cast<RawClosureData*>(d->Ref(id)); |
764 Deserializer::InitializeHeader(data, kClosureDataCid, | 764 Deserializer::InitializeHeader(data, kClosureDataCid, |
765 ClosureData::InstanceSize(), is_vm_object); | 765 ClosureData::InstanceSize(), is_vm_object); |
766 if (d->kind() == Snapshot::kAppNoJIT) { | 766 if (d->kind() == Snapshot::kAppAOT) { |
767 data->ptr()->context_scope_ = ContextScope::null(); | 767 data->ptr()->context_scope_ = ContextScope::null(); |
768 } else { | 768 } else { |
769 data->ptr()->context_scope_ = | 769 data->ptr()->context_scope_ = |
770 static_cast<RawContextScope*>(d->ReadRef()); | 770 static_cast<RawContextScope*>(d->ReadRef()); |
771 } | 771 } |
772 data->ptr()->parent_function_ = static_cast<RawFunction*>(d->ReadRef()); | 772 data->ptr()->parent_function_ = static_cast<RawFunction*>(d->ReadRef()); |
773 data->ptr()->signature_type_ = static_cast<RawType*>(d->ReadRef()); | 773 data->ptr()->signature_type_ = static_cast<RawType*>(d->ReadRef()); |
774 data->ptr()->closure_ = static_cast<RawInstance*>(d->ReadRef()); | 774 data->ptr()->closure_ = static_cast<RawInstance*>(d->ReadRef()); |
775 } | 775 } |
776 } | 776 } |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 RawField* field = Field::RawCast(object); | 867 RawField* field = Field::RawCast(object); |
868 objects_.Add(field); | 868 objects_.Add(field); |
869 | 869 |
870 Snapshot::Kind kind = s->kind(); | 870 Snapshot::Kind kind = s->kind(); |
871 | 871 |
872 s->Push(field->ptr()->name_); | 872 s->Push(field->ptr()->name_); |
873 s->Push(field->ptr()->owner_); | 873 s->Push(field->ptr()->owner_); |
874 s->Push(field->ptr()->type_); | 874 s->Push(field->ptr()->type_); |
875 // Write out the initial static value or field offset. | 875 // Write out the initial static value or field offset. |
876 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) { | 876 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) { |
877 if (kind == Snapshot::kAppNoJIT) { | 877 if (kind == Snapshot::kAppAOT) { |
878 // For precompiled static fields, the value was already reset and | 878 // For precompiled static fields, the value was already reset and |
879 // initializer_ now contains a Function. | 879 // initializer_ now contains a Function. |
880 s->Push(field->ptr()->value_.static_value_); | 880 s->Push(field->ptr()->value_.static_value_); |
881 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) { | 881 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) { |
882 // Do not reset const fields. | 882 // Do not reset const fields. |
883 s->Push(field->ptr()->value_.static_value_); | 883 s->Push(field->ptr()->value_.static_value_); |
884 } else { | 884 } else { |
885 // Otherwise, for static fields we write out the initial static value. | 885 // Otherwise, for static fields we write out the initial static value. |
886 s->Push(field->ptr()->initializer_.saved_value_); | 886 s->Push(field->ptr()->initializer_.saved_value_); |
887 } | 887 } |
888 } else { | 888 } else { |
889 s->Push(field->ptr()->value_.offset_); | 889 s->Push(field->ptr()->value_.offset_); |
890 } | 890 } |
891 // Write out the initializer function or saved initial value. | 891 // Write out the initializer function or saved initial value. |
892 if (kind == Snapshot::kAppNoJIT) { | 892 if (kind == Snapshot::kAppAOT) { |
893 s->Push(field->ptr()->initializer_.precompiled_); | 893 s->Push(field->ptr()->initializer_.precompiled_); |
894 } else { | 894 } else { |
895 s->Push(field->ptr()->initializer_.saved_value_); | 895 s->Push(field->ptr()->initializer_.saved_value_); |
896 } | 896 } |
897 if (kind != Snapshot::kAppNoJIT) { | 897 if (kind != Snapshot::kAppAOT) { |
898 // Write out the guarded list length. | 898 // Write out the guarded list length. |
899 s->Push(field->ptr()->guarded_list_length_); | 899 s->Push(field->ptr()->guarded_list_length_); |
900 } | 900 } |
901 if (kind == Snapshot::kAppWithJIT) { | 901 if (kind == Snapshot::kAppJIT) { |
902 s->Push(field->ptr()->dependent_code_); | 902 s->Push(field->ptr()->dependent_code_); |
903 } | 903 } |
904 } | 904 } |
905 | 905 |
906 void WriteAlloc(Serializer* s) { | 906 void WriteAlloc(Serializer* s) { |
907 s->WriteCid(kFieldCid); | 907 s->WriteCid(kFieldCid); |
908 intptr_t count = objects_.length(); | 908 intptr_t count = objects_.length(); |
909 s->Write<int32_t>(count); | 909 s->Write<int32_t>(count); |
910 for (intptr_t i = 0; i < count; i++) { | 910 for (intptr_t i = 0; i < count; i++) { |
911 RawField* field = objects_[i]; | 911 RawField* field = objects_[i]; |
912 s->AssignRef(field); | 912 s->AssignRef(field); |
913 } | 913 } |
914 } | 914 } |
915 | 915 |
916 void WriteFill(Serializer* s) { | 916 void WriteFill(Serializer* s) { |
917 Snapshot::Kind kind = s->kind(); | 917 Snapshot::Kind kind = s->kind(); |
918 intptr_t count = objects_.length(); | 918 intptr_t count = objects_.length(); |
919 for (intptr_t i = 0; i < count; i++) { | 919 for (intptr_t i = 0; i < count; i++) { |
920 RawField* field = objects_[i]; | 920 RawField* field = objects_[i]; |
921 | 921 |
922 s->WriteRef(field->ptr()->name_); | 922 s->WriteRef(field->ptr()->name_); |
923 s->WriteRef(field->ptr()->owner_); | 923 s->WriteRef(field->ptr()->owner_); |
924 s->WriteRef(field->ptr()->type_); | 924 s->WriteRef(field->ptr()->type_); |
925 // Write out the initial static value or field offset. | 925 // Write out the initial static value or field offset. |
926 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) { | 926 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) { |
927 if (kind == Snapshot::kAppNoJIT) { | 927 if (kind == Snapshot::kAppAOT) { |
928 // For precompiled static fields, the value was already reset and | 928 // For precompiled static fields, the value was already reset and |
929 // initializer_ now contains a Function. | 929 // initializer_ now contains a Function. |
930 s->WriteRef(field->ptr()->value_.static_value_); | 930 s->WriteRef(field->ptr()->value_.static_value_); |
931 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) { | 931 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) { |
932 // Do not reset const fields. | 932 // Do not reset const fields. |
933 s->WriteRef(field->ptr()->value_.static_value_); | 933 s->WriteRef(field->ptr()->value_.static_value_); |
934 } else { | 934 } else { |
935 // Otherwise, for static fields we write out the initial static value. | 935 // Otherwise, for static fields we write out the initial static value. |
936 s->WriteRef(field->ptr()->initializer_.saved_value_); | 936 s->WriteRef(field->ptr()->initializer_.saved_value_); |
937 } | 937 } |
938 } else { | 938 } else { |
939 s->WriteRef(field->ptr()->value_.offset_); | 939 s->WriteRef(field->ptr()->value_.offset_); |
940 } | 940 } |
941 // Write out the initializer function or saved initial value. | 941 // Write out the initializer function or saved initial value. |
942 if (kind == Snapshot::kAppNoJIT) { | 942 if (kind == Snapshot::kAppAOT) { |
943 s->WriteRef(field->ptr()->initializer_.precompiled_); | 943 s->WriteRef(field->ptr()->initializer_.precompiled_); |
944 } else { | 944 } else { |
945 s->WriteRef(field->ptr()->initializer_.saved_value_); | 945 s->WriteRef(field->ptr()->initializer_.saved_value_); |
946 } | 946 } |
947 if (kind != Snapshot::kAppNoJIT) { | 947 if (kind != Snapshot::kAppAOT) { |
948 // Write out the guarded list length. | 948 // Write out the guarded list length. |
949 s->WriteRef(field->ptr()->guarded_list_length_); | 949 s->WriteRef(field->ptr()->guarded_list_length_); |
950 } | 950 } |
951 if (kind == Snapshot::kAppWithJIT) { | 951 if (kind == Snapshot::kAppJIT) { |
952 s->WriteRef(field->ptr()->dependent_code_); | 952 s->WriteRef(field->ptr()->dependent_code_); |
953 } | 953 } |
954 | 954 |
955 if (kind != Snapshot::kAppNoJIT) { | 955 if (kind != Snapshot::kAppAOT) { |
956 s->WriteTokenPosition(field->ptr()->token_pos_); | 956 s->WriteTokenPosition(field->ptr()->token_pos_); |
957 s->WriteCid(field->ptr()->guarded_cid_); | 957 s->WriteCid(field->ptr()->guarded_cid_); |
958 s->WriteCid(field->ptr()->is_nullable_); | 958 s->WriteCid(field->ptr()->is_nullable_); |
959 } | 959 } |
960 s->Write<uint8_t>(field->ptr()->kind_bits_); | 960 s->Write<uint8_t>(field->ptr()->kind_bits_); |
961 } | 961 } |
962 } | 962 } |
963 | 963 |
964 private: | 964 private: |
965 GrowableArray<RawField*> objects_; | 965 GrowableArray<RawField*> objects_; |
(...skipping 27 matching lines...) Expand all Loading... |
993 RawObject** from = field->from(); | 993 RawObject** from = field->from(); |
994 RawObject** to_snapshot = field->to_snapshot(kind); | 994 RawObject** to_snapshot = field->to_snapshot(kind); |
995 RawObject** to = field->to(); | 995 RawObject** to = field->to(); |
996 for (RawObject** p = from; p <= to_snapshot; p++) { | 996 for (RawObject** p = from; p <= to_snapshot; p++) { |
997 *p = d->ReadRef(); | 997 *p = d->ReadRef(); |
998 } | 998 } |
999 for (RawObject** p = to_snapshot + 1; p <= to; p++) { | 999 for (RawObject** p = to_snapshot + 1; p <= to; p++) { |
1000 *p = Object::null(); | 1000 *p = Object::null(); |
1001 } | 1001 } |
1002 | 1002 |
1003 if (kind != Snapshot::kAppNoJIT) { | 1003 if (kind != Snapshot::kAppAOT) { |
1004 field->ptr()->token_pos_ = d->ReadTokenPosition(); | 1004 field->ptr()->token_pos_ = d->ReadTokenPosition(); |
1005 field->ptr()->guarded_cid_ = d->ReadCid(); | 1005 field->ptr()->guarded_cid_ = d->ReadCid(); |
1006 field->ptr()->is_nullable_ = d->ReadCid(); | 1006 field->ptr()->is_nullable_ = d->ReadCid(); |
1007 } | 1007 } |
1008 field->ptr()->kind_bits_ = d->Read<uint8_t>(); | 1008 field->ptr()->kind_bits_ = d->Read<uint8_t>(); |
1009 } | 1009 } |
1010 } | 1010 } |
1011 | 1011 |
1012 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) { | 1012 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) { |
1013 NOT_IN_PRODUCT(TimelineDurationScope tds( | 1013 NOT_IN_PRODUCT(TimelineDurationScope tds( |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1482 void Trace(Serializer* s, RawObject* object) { | 1482 void Trace(Serializer* s, RawObject* object) { |
1483 RawCode* code = Code::RawCast(object); | 1483 RawCode* code = Code::RawCast(object); |
1484 objects_.Add(code); | 1484 objects_.Add(code); |
1485 | 1485 |
1486 s->Push(code->ptr()->object_pool_); | 1486 s->Push(code->ptr()->object_pool_); |
1487 s->Push(code->ptr()->owner_); | 1487 s->Push(code->ptr()->owner_); |
1488 s->Push(code->ptr()->exception_handlers_); | 1488 s->Push(code->ptr()->exception_handlers_); |
1489 s->Push(code->ptr()->pc_descriptors_); | 1489 s->Push(code->ptr()->pc_descriptors_); |
1490 s->Push(code->ptr()->stackmaps_); | 1490 s->Push(code->ptr()->stackmaps_); |
1491 | 1491 |
1492 if (s->kind() == Snapshot::kAppWithJIT) { | 1492 if (s->kind() == Snapshot::kAppJIT) { |
1493 s->Push(code->ptr()->deopt_info_array_); | 1493 s->Push(code->ptr()->deopt_info_array_); |
1494 s->Push(code->ptr()->static_calls_target_table_); | 1494 s->Push(code->ptr()->static_calls_target_table_); |
1495 NOT_IN_PRODUCT(s->Push(code->ptr()->inlined_metadata_)); | 1495 NOT_IN_PRODUCT(s->Push(code->ptr()->inlined_metadata_)); |
1496 NOT_IN_PRODUCT(s->Push(code->ptr()->return_address_metadata_)); | 1496 NOT_IN_PRODUCT(s->Push(code->ptr()->return_address_metadata_)); |
1497 } | 1497 } |
1498 } | 1498 } |
1499 | 1499 |
1500 void WriteAlloc(Serializer* s) { | 1500 void WriteAlloc(Serializer* s) { |
1501 s->WriteCid(kCodeCid); | 1501 s->WriteCid(kCodeCid); |
1502 intptr_t count = objects_.length(); | 1502 intptr_t count = objects_.length(); |
1503 s->Write<int32_t>(count); | 1503 s->Write<int32_t>(count); |
1504 for (intptr_t i = 0; i < count; i++) { | 1504 for (intptr_t i = 0; i < count; i++) { |
1505 RawCode* code = objects_[i]; | 1505 RawCode* code = objects_[i]; |
1506 s->AssignRef(code); | 1506 s->AssignRef(code); |
1507 } | 1507 } |
1508 } | 1508 } |
1509 | 1509 |
1510 void WriteFill(Serializer* s) { | 1510 void WriteFill(Serializer* s) { |
1511 Snapshot::Kind kind = s->kind(); | 1511 Snapshot::Kind kind = s->kind(); |
1512 intptr_t count = objects_.length(); | 1512 intptr_t count = objects_.length(); |
1513 for (intptr_t i = 0; i < count; i++) { | 1513 for (intptr_t i = 0; i < count; i++) { |
1514 RawCode* code = objects_[i]; | 1514 RawCode* code = objects_[i]; |
1515 | 1515 |
1516 intptr_t pointer_offsets_length = | 1516 intptr_t pointer_offsets_length = |
1517 Code::PtrOffBits::decode(code->ptr()->state_bits_); | 1517 Code::PtrOffBits::decode(code->ptr()->state_bits_); |
1518 if (pointer_offsets_length != 0) { | 1518 if (pointer_offsets_length != 0) { |
1519 FATAL("Cannot serialize code with embedded pointers"); | 1519 FATAL("Cannot serialize code with embedded pointers"); |
1520 } | 1520 } |
1521 if (kind == Snapshot::kAppNoJIT) { | 1521 if (kind == Snapshot::kAppAOT) { |
1522 // No disabled code in precompilation. | 1522 // No disabled code in precompilation. |
1523 NOT_IN_PRECOMPILED(ASSERT(code->ptr()->instructions_ == | 1523 NOT_IN_PRECOMPILED(ASSERT(code->ptr()->instructions_ == |
1524 code->ptr()->active_instructions_)); | 1524 code->ptr()->active_instructions_)); |
1525 } | 1525 } |
1526 | 1526 |
1527 RawInstructions* instr = code->ptr()->instructions_; | 1527 RawInstructions* instr = code->ptr()->instructions_; |
1528 int32_t text_offset = s->GetTextOffset(instr, code); | 1528 int32_t text_offset = s->GetTextOffset(instr, code); |
1529 s->Write<int32_t>(text_offset); | 1529 s->Write<int32_t>(text_offset); |
1530 if (s->kind() == Snapshot::kAppWithJIT) { | 1530 if (s->kind() == Snapshot::kAppJIT) { |
1531 // TODO(rmacnak): Fix references to disabled code before serializing. | 1531 // TODO(rmacnak): Fix references to disabled code before serializing. |
1532 if (code->ptr()->active_instructions_ != code->ptr()->instructions_) { | 1532 if (code->ptr()->active_instructions_ != code->ptr()->instructions_) { |
1533 instr = code->ptr()->active_instructions_; | 1533 instr = code->ptr()->active_instructions_; |
1534 text_offset = s->GetTextOffset(instr, code); | 1534 text_offset = s->GetTextOffset(instr, code); |
1535 } | 1535 } |
1536 s->Write<int32_t>(text_offset); | 1536 s->Write<int32_t>(text_offset); |
1537 } | 1537 } |
1538 | 1538 |
1539 s->WriteRef(code->ptr()->object_pool_); | 1539 s->WriteRef(code->ptr()->object_pool_); |
1540 s->WriteRef(code->ptr()->owner_); | 1540 s->WriteRef(code->ptr()->owner_); |
1541 s->WriteRef(code->ptr()->exception_handlers_); | 1541 s->WriteRef(code->ptr()->exception_handlers_); |
1542 s->WriteRef(code->ptr()->pc_descriptors_); | 1542 s->WriteRef(code->ptr()->pc_descriptors_); |
1543 s->WriteRef(code->ptr()->stackmaps_); | 1543 s->WriteRef(code->ptr()->stackmaps_); |
1544 | 1544 |
1545 if (s->kind() == Snapshot::kAppWithJIT) { | 1545 if (s->kind() == Snapshot::kAppJIT) { |
1546 s->WriteRef(code->ptr()->deopt_info_array_); | 1546 s->WriteRef(code->ptr()->deopt_info_array_); |
1547 s->WriteRef(code->ptr()->static_calls_target_table_); | 1547 s->WriteRef(code->ptr()->static_calls_target_table_); |
1548 NOT_IN_PRODUCT(s->WriteRef(code->ptr()->inlined_metadata_)); | 1548 NOT_IN_PRODUCT(s->WriteRef(code->ptr()->inlined_metadata_)); |
1549 NOT_IN_PRODUCT(s->WriteRef(code->ptr()->return_address_metadata_)); | 1549 NOT_IN_PRODUCT(s->WriteRef(code->ptr()->return_address_metadata_)); |
1550 } | 1550 } |
1551 | 1551 |
1552 s->Write<int32_t>(code->ptr()->state_bits_); | 1552 s->Write<int32_t>(code->ptr()->state_bits_); |
1553 } | 1553 } |
1554 } | 1554 } |
1555 | 1555 |
(...skipping 30 matching lines...) Expand all Loading... |
1586 RawInstructions* instr = reinterpret_cast<RawInstructions*>( | 1586 RawInstructions* instr = reinterpret_cast<RawInstructions*>( |
1587 d->GetInstructionsAt(text_offset) + kHeapObjectTag); | 1587 d->GetInstructionsAt(text_offset) + kHeapObjectTag); |
1588 | 1588 |
1589 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr); | 1589 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr); |
1590 code->ptr()->checked_entry_point_ = | 1590 code->ptr()->checked_entry_point_ = |
1591 Instructions::CheckedEntryPoint(instr); | 1591 Instructions::CheckedEntryPoint(instr); |
1592 NOT_IN_PRECOMPILED(code->ptr()->active_instructions_ = instr); | 1592 NOT_IN_PRECOMPILED(code->ptr()->active_instructions_ = instr); |
1593 code->ptr()->instructions_ = instr; | 1593 code->ptr()->instructions_ = instr; |
1594 | 1594 |
1595 #if !defined(DART_PRECOMPILED_RUNTIME) | 1595 #if !defined(DART_PRECOMPILED_RUNTIME) |
1596 if (d->kind() == Snapshot::kAppWithJIT) { | 1596 if (d->kind() == Snapshot::kAppJIT) { |
1597 int32_t text_offset = d->Read<int32_t>(); | 1597 int32_t text_offset = d->Read<int32_t>(); |
1598 RawInstructions* instr = reinterpret_cast<RawInstructions*>( | 1598 RawInstructions* instr = reinterpret_cast<RawInstructions*>( |
1599 d->GetInstructionsAt(text_offset) + kHeapObjectTag); | 1599 d->GetInstructionsAt(text_offset) + kHeapObjectTag); |
1600 code->ptr()->active_instructions_ = instr; | 1600 code->ptr()->active_instructions_ = instr; |
1601 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr); | 1601 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr); |
1602 code->ptr()->checked_entry_point_ = | 1602 code->ptr()->checked_entry_point_ = |
1603 Instructions::CheckedEntryPoint(instr); | 1603 Instructions::CheckedEntryPoint(instr); |
1604 } | 1604 } |
1605 #endif // !DART_PRECOMPILED_RUNTIME | 1605 #endif // !DART_PRECOMPILED_RUNTIME |
1606 | 1606 |
1607 code->ptr()->object_pool_ = | 1607 code->ptr()->object_pool_ = |
1608 reinterpret_cast<RawObjectPool*>(d->ReadRef()); | 1608 reinterpret_cast<RawObjectPool*>(d->ReadRef()); |
1609 code->ptr()->owner_ = d->ReadRef(); | 1609 code->ptr()->owner_ = d->ReadRef(); |
1610 code->ptr()->exception_handlers_ = | 1610 code->ptr()->exception_handlers_ = |
1611 reinterpret_cast<RawExceptionHandlers*>(d->ReadRef()); | 1611 reinterpret_cast<RawExceptionHandlers*>(d->ReadRef()); |
1612 code->ptr()->pc_descriptors_ = | 1612 code->ptr()->pc_descriptors_ = |
1613 reinterpret_cast<RawPcDescriptors*>(d->ReadRef()); | 1613 reinterpret_cast<RawPcDescriptors*>(d->ReadRef()); |
1614 code->ptr()->stackmaps_ = reinterpret_cast<RawArray*>(d->ReadRef()); | 1614 code->ptr()->stackmaps_ = reinterpret_cast<RawArray*>(d->ReadRef()); |
1615 | 1615 |
1616 #if !defined(DART_PRECOMPILED_RUNTIME) | 1616 #if !defined(DART_PRECOMPILED_RUNTIME) |
1617 if (d->kind() == Snapshot::kAppWithJIT) { | 1617 if (d->kind() == Snapshot::kAppJIT) { |
1618 code->ptr()->deopt_info_array_ = | 1618 code->ptr()->deopt_info_array_ = |
1619 reinterpret_cast<RawArray*>(d->ReadRef()); | 1619 reinterpret_cast<RawArray*>(d->ReadRef()); |
1620 code->ptr()->static_calls_target_table_ = | 1620 code->ptr()->static_calls_target_table_ = |
1621 reinterpret_cast<RawArray*>(d->ReadRef()); | 1621 reinterpret_cast<RawArray*>(d->ReadRef()); |
1622 #if defined(PRODUCT) | 1622 #if defined(PRODUCT) |
1623 code->ptr()->inlined_metadata_ = Array::null(); | 1623 code->ptr()->inlined_metadata_ = Array::null(); |
1624 code->ptr()->return_address_metadata_ = Object::null(); | 1624 code->ptr()->return_address_metadata_ = Object::null(); |
1625 #else | 1625 #else |
1626 code->ptr()->inlined_metadata_ = | 1626 code->ptr()->inlined_metadata_ = |
1627 reinterpret_cast<RawArray*>(d->ReadRef()); | 1627 reinterpret_cast<RawArray*>(d->ReadRef()); |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2238 void WriteFill(Serializer* s) { | 2238 void WriteFill(Serializer* s) { |
2239 Snapshot::Kind kind = s->kind(); | 2239 Snapshot::Kind kind = s->kind(); |
2240 intptr_t count = objects_.length(); | 2240 intptr_t count = objects_.length(); |
2241 for (intptr_t i = 0; i < count; i++) { | 2241 for (intptr_t i = 0; i < count; i++) { |
2242 RawICData* ic = objects_[i]; | 2242 RawICData* ic = objects_[i]; |
2243 RawObject** from = ic->from(); | 2243 RawObject** from = ic->from(); |
2244 RawObject** to = ic->to_snapshot(kind); | 2244 RawObject** to = ic->to_snapshot(kind); |
2245 for (RawObject** p = from; p <= to; p++) { | 2245 for (RawObject** p = from; p <= to; p++) { |
2246 s->WriteRef(*p); | 2246 s->WriteRef(*p); |
2247 } | 2247 } |
2248 if (kind != Snapshot::kAppNoJIT) { | 2248 if (kind != Snapshot::kAppAOT) { |
2249 NOT_IN_PRECOMPILED(s->Write<int32_t>(ic->ptr()->deopt_id_)); | 2249 NOT_IN_PRECOMPILED(s->Write<int32_t>(ic->ptr()->deopt_id_)); |
2250 } | 2250 } |
2251 s->Write<uint32_t>(ic->ptr()->state_bits_); | 2251 s->Write<uint32_t>(ic->ptr()->state_bits_); |
2252 #if defined(TAG_IC_DATA) | 2252 #if defined(TAG_IC_DATA) |
2253 s->Write<int32_t>(ic->ptr()->tag_); | 2253 s->Write<int32_t>(ic->ptr()->tag_); |
2254 #endif | 2254 #endif |
2255 } | 2255 } |
2256 } | 2256 } |
2257 | 2257 |
2258 private: | 2258 private: |
(...skipping 3102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5361 | 5361 |
5362 deserializer.ReadVMSnapshot(); | 5362 deserializer.ReadVMSnapshot(); |
5363 | 5363 |
5364 Dart::set_instructions_snapshot_buffer(instructions_buffer_); | 5364 Dart::set_instructions_snapshot_buffer(instructions_buffer_); |
5365 Dart::set_data_snapshot_buffer(data_buffer_); | 5365 Dart::set_data_snapshot_buffer(data_buffer_); |
5366 | 5366 |
5367 return ApiError::null(); | 5367 return ApiError::null(); |
5368 } | 5368 } |
5369 | 5369 |
5370 } // namespace dart | 5370 } // namespace dart |
OLD | NEW |