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

Side by Side Diff: runtime/vm/snapshot.h

Issue 2622053002: Refactor snapshots pieces to include a section for loading instructions into the heap of a regular … (Closed)
Patch Set: . Created 3 years, 11 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
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 #ifndef RUNTIME_VM_SNAPSHOT_H_ 5 #ifndef RUNTIME_VM_SNAPSHOT_H_
6 #define RUNTIME_VM_SNAPSHOT_H_ 6 #define RUNTIME_VM_SNAPSHOT_H_
7 7
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/allocation.h" 9 #include "vm/allocation.h"
10 #include "vm/bitfield.h" 10 #include "vm/bitfield.h"
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 return static_cast<Kind>(ReadUnaligned(&unaligned_kind_)); 183 return static_cast<Kind>(ReadUnaligned(&unaligned_kind_));
184 } 184 }
185 185
186 static bool IsFull(Kind kind) { 186 static bool IsFull(Kind kind) {
187 return (kind == kCore) || (kind == kAppJIT) || (kind == kAppAOT); 187 return (kind == kCore) || (kind == kAppJIT) || (kind == kAppAOT);
188 } 188 }
189 static bool IncludesCode(Kind kind) { 189 static bool IncludesCode(Kind kind) {
190 return (kind == kAppJIT) || (kind == kAppAOT); 190 return (kind == kAppJIT) || (kind == kAppAOT);
191 } 191 }
192 192
193 uint8_t* Addr() { return reinterpret_cast<uint8_t*>(this); } 193 const uint8_t* Addr() const { return reinterpret_cast<const uint8_t*>(this); }
194 194
195 static intptr_t length_offset() { 195 static intptr_t length_offset() {
196 return OFFSET_OF(Snapshot, unaligned_length_); 196 return OFFSET_OF(Snapshot, unaligned_length_);
197 } 197 }
198 static intptr_t kind_offset() { return OFFSET_OF(Snapshot, unaligned_kind_); } 198 static intptr_t kind_offset() { return OFFSET_OF(Snapshot, unaligned_kind_); }
199 199
200 private: 200 private:
201 // Prevent Snapshot from ever being allocated directly. 201 // Prevent Snapshot from ever being allocated directly.
202 Snapshot(); 202 Snapshot();
203 203
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 public: 368 public:
369 InstructionsReader(const uint8_t* instructions_buffer, 369 InstructionsReader(const uint8_t* instructions_buffer,
370 const uint8_t* data_buffer) 370 const uint8_t* data_buffer)
371 : instructions_buffer_(instructions_buffer), data_buffer_(data_buffer) { 371 : instructions_buffer_(instructions_buffer), data_buffer_(data_buffer) {
372 ASSERT(instructions_buffer != NULL); 372 ASSERT(instructions_buffer != NULL);
373 ASSERT(data_buffer != NULL); 373 ASSERT(data_buffer != NULL);
374 ASSERT(Utils::IsAligned(reinterpret_cast<uword>(instructions_buffer), 374 ASSERT(Utils::IsAligned(reinterpret_cast<uword>(instructions_buffer),
375 OS::PreferredCodeAlignment())); 375 OS::PreferredCodeAlignment()));
376 } 376 }
377 377
378 uword GetInstructionsAt(int32_t offset); 378 RawInstructions* GetInstructionsAt(int32_t offset);
379 RawObject* GetObjectAt(int32_t offset); 379 RawObject* GetObjectAt(int32_t offset);
380 380
381 private: 381 private:
382 const uint8_t* instructions_buffer_; 382 const uint8_t* instructions_buffer_;
383 const uint8_t* data_buffer_; 383 const uint8_t* data_buffer_;
384 384
385 DISALLOW_COPY_AND_ASSIGN(InstructionsReader); 385 DISALLOW_COPY_AND_ASSIGN(InstructionsReader);
386 }; 386 };
387 387
388 388
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 GrowableArray<Node*> nodes_; 721 GrowableArray<Node*> nodes_;
722 intptr_t first_unprocessed_object_id_; 722 intptr_t first_unprocessed_object_id_;
723 723
724 DISALLOW_COPY_AND_ASSIGN(ForwardList); 724 DISALLOW_COPY_AND_ASSIGN(ForwardList);
725 }; 725 };
726 726
727 727
728 class InstructionsWriter : public ZoneAllocated { 728 class InstructionsWriter : public ZoneAllocated {
729 public: 729 public:
730 InstructionsWriter() 730 InstructionsWriter()
731 : next_offset_(InstructionsSnapshot::kHeaderSize), 731 : next_offset_(0), next_object_offset_(0), instructions_(), objects_() {
732 next_object_offset_(DataSnapshot::kHeaderSize), 732 ResetOffsets();
733 instructions_(), 733 }
734 objects_() {}
735 virtual ~InstructionsWriter() {} 734 virtual ~InstructionsWriter() {}
736 735
736 void ResetOffsets() {
737 next_offset_ = InstructionsSnapshot::kHeaderSize;
738 next_object_offset_ = DataSnapshot::kHeaderSize;
739 instructions_.Clear();
740 objects_.Clear();
741 }
737 int32_t GetOffsetFor(RawInstructions* instructions, RawCode* code); 742 int32_t GetOffsetFor(RawInstructions* instructions, RawCode* code);
738
739 int32_t GetObjectOffsetFor(RawObject* raw_object); 743 int32_t GetObjectOffsetFor(RawObject* raw_object);
740 744
741 virtual void Write(uint8_t* vmisolate_buffer, 745 void Write(WriteStream* clustered_stream, bool vm);
742 intptr_t vmisolate_length,
743 uint8_t* isolate_buffer,
744 intptr_t isolate_length) = 0;
745 virtual intptr_t text_size() = 0; 746 virtual intptr_t text_size() = 0;
746 virtual intptr_t data_size() = 0; 747 intptr_t data_size() { return next_object_offset_; }
747 748
748 protected: 749 protected:
750 void WriteROData(WriteStream* stream);
751 virtual void WriteText(WriteStream* clustered_stream, bool vm) = 0;
752
749 struct InstructionsData { 753 struct InstructionsData {
750 explicit InstructionsData(RawInstructions* insns, 754 explicit InstructionsData(RawInstructions* insns,
751 RawCode* code, 755 RawCode* code,
752 intptr_t offset) 756 intptr_t offset)
753 : raw_insns_(insns), raw_code_(code), offset_(offset) {} 757 : raw_insns_(insns), raw_code_(code), offset_(offset) {}
754 758
755 union { 759 union {
756 RawInstructions* raw_insns_; 760 RawInstructions* raw_insns_;
757 const Instructions* insns_; 761 const Instructions* insns_;
758 }; 762 };
(...skipping 23 matching lines...) Expand all
782 }; 786 };
783 787
784 788
785 class AssemblyInstructionsWriter : public InstructionsWriter { 789 class AssemblyInstructionsWriter : public InstructionsWriter {
786 public: 790 public:
787 AssemblyInstructionsWriter(uint8_t** assembly_buffer, 791 AssemblyInstructionsWriter(uint8_t** assembly_buffer,
788 ReAlloc alloc, 792 ReAlloc alloc,
789 intptr_t initial_size) 793 intptr_t initial_size)
790 : InstructionsWriter(), 794 : InstructionsWriter(),
791 assembly_stream_(assembly_buffer, alloc, initial_size), 795 assembly_stream_(assembly_buffer, alloc, initial_size),
792 text_size_(0), 796 text_size_(0) {}
793 data_size_(0) {}
794 797
795 virtual void Write(uint8_t* vmisolate_buffer, 798 virtual void WriteText(WriteStream* clustered_stream, bool vm);
796 intptr_t vmisolate_length,
797 uint8_t* isolate_buffer,
798 intptr_t isolate_length);
799 virtual intptr_t text_size() { return text_size_; } 799 virtual intptr_t text_size() { return text_size_; }
800 virtual intptr_t data_size() { return data_size_; }
801 800
802 intptr_t AssemblySize() const { return assembly_stream_.bytes_written(); } 801 intptr_t AssemblySize() const { return assembly_stream_.bytes_written(); }
803 802
804 private: 803 private:
805 void WriteWordLiteralText(uword value) { 804 void WriteWordLiteralText(uword value) {
806 // Padding is helpful for comparing the .S with --disassemble. 805 // Padding is helpful for comparing the .S with --disassemble.
807 #if defined(ARCH_IS_64_BIT) 806 #if defined(ARCH_IS_64_BIT)
808 assembly_stream_.Print(".quad 0x%0.16" Px "\n", value); 807 assembly_stream_.Print(".quad 0x%0.16" Px "\n", value);
809 #else 808 #else
810 assembly_stream_.Print(".long 0x%0.8" Px "\n", value); 809 assembly_stream_.Print(".long 0x%0.8" Px "\n", value);
811 #endif 810 #endif
812 text_size_ += sizeof(value); 811 text_size_ += sizeof(value);
813 } 812 }
814 813
815 void WriteWordLiteralData(uword value) {
816 // Padding is helpful for comparing the .S with --disassemble.
817 #if defined(ARCH_IS_64_BIT)
818 assembly_stream_.Print(".quad 0x%0.16" Px "\n", value);
819 #else
820 assembly_stream_.Print(".long 0x%0.8" Px "\n", value);
821 #endif
822 data_size_ += sizeof(value);
823 }
824
825 WriteStream assembly_stream_; 814 WriteStream assembly_stream_;
826 intptr_t text_size_; 815 intptr_t text_size_;
827 intptr_t data_size_;
828 816
829 DISALLOW_COPY_AND_ASSIGN(AssemblyInstructionsWriter); 817 DISALLOW_COPY_AND_ASSIGN(AssemblyInstructionsWriter);
830 }; 818 };
831 819
832 820
833 class BlobInstructionsWriter : public InstructionsWriter { 821 class BlobInstructionsWriter : public InstructionsWriter {
834 public: 822 public:
835 BlobInstructionsWriter(uint8_t** instructions_blob_buffer, 823 BlobInstructionsWriter(uint8_t** instructions_blob_buffer,
836 uint8_t** rodata_blob_buffer,
837 ReAlloc alloc, 824 ReAlloc alloc,
838 intptr_t initial_size) 825 intptr_t initial_size)
839 : InstructionsWriter(), 826 : InstructionsWriter(),
840 instructions_blob_stream_(instructions_blob_buffer, 827 instructions_blob_stream_(instructions_blob_buffer,
841 alloc, 828 alloc,
842 initial_size), 829 initial_size) {}
843 rodata_blob_stream_(rodata_blob_buffer, alloc, initial_size) {}
844 830
845 virtual void Write(uint8_t* vmisolate_buffer, 831 virtual void WriteText(WriteStream* clustered_stream, bool vm);
846 intptr_t vmisolate_length,
847 uint8_t* isolate_buffer,
848 intptr_t isolate_length);
849 virtual intptr_t text_size() { return InstructionsBlobSize(); } 832 virtual intptr_t text_size() { return InstructionsBlobSize(); }
850 virtual intptr_t data_size() { return RodataBlobSize(); }
851 833
852 intptr_t InstructionsBlobSize() const { 834 intptr_t InstructionsBlobSize() const {
853 return instructions_blob_stream_.bytes_written(); 835 return instructions_blob_stream_.bytes_written();
854 } 836 }
855 intptr_t RodataBlobSize() const {
856 return rodata_blob_stream_.bytes_written();
857 }
858 837
859 private: 838 private:
860 WriteStream instructions_blob_stream_; 839 WriteStream instructions_blob_stream_;
861 WriteStream rodata_blob_stream_;
862 840
863 DISALLOW_COPY_AND_ASSIGN(BlobInstructionsWriter); 841 DISALLOW_COPY_AND_ASSIGN(BlobInstructionsWriter);
864 }; 842 };
865 843
866 844
867 class SnapshotWriter : public BaseWriter { 845 class SnapshotWriter : public BaseWriter {
868 protected: 846 protected:
869 SnapshotWriter(Thread* thread, 847 SnapshotWriter(Thread* thread,
870 Snapshot::Kind kind, 848 Snapshot::Kind kind,
871 uint8_t** buffer, 849 uint8_t** buffer,
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 private: 1008 private:
1031 SnapshotWriter* writer_; 1009 SnapshotWriter* writer_;
1032 bool as_references_; 1010 bool as_references_;
1033 1011
1034 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); 1012 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor);
1035 }; 1013 };
1036 1014
1037 } // namespace dart 1015 } // namespace dart
1038 1016
1039 #endif // RUNTIME_VM_SNAPSHOT_H_ 1017 #endif // RUNTIME_VM_SNAPSHOT_H_
OLDNEW
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698