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

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

Issue 1584443002: VM: Precompiled rodata snapshot. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: win32, android build Created 4 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
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 VM_SNAPSHOT_H_ 5 #ifndef VM_SNAPSHOT_H_
6 #define VM_SNAPSHOT_H_ 6 #define 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 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 217
218 static const intptr_t kHeaderSize = OS::kMaxPreferredCodeAlignment; 218 static const intptr_t kHeaderSize = OS::kMaxPreferredCodeAlignment;
219 219
220 private: 220 private:
221 const void* raw_memory_; // The symbol kInstructionsSnapshot. 221 const void* raw_memory_; // The symbol kInstructionsSnapshot.
222 222
223 DISALLOW_COPY_AND_ASSIGN(InstructionsSnapshot); 223 DISALLOW_COPY_AND_ASSIGN(InstructionsSnapshot);
224 }; 224 };
225 225
226 226
227 class DataSnapshot : ValueObject {
228 public:
229 explicit DataSnapshot(const void* raw_memory)
230 : raw_memory_(raw_memory) {
231 ASSERT(Utils::IsAligned(raw_memory, 2 * kWordSize)); // kObjectAlignment
232 }
233
234 void* data_start() {
235 return reinterpret_cast<void*>(
236 reinterpret_cast<uword>(raw_memory_) + kHeaderSize);
237 }
238
239 uword data_size() {
240 uword snapshot_size = *reinterpret_cast<const uword*>(raw_memory_);
241 return snapshot_size - kHeaderSize;
242 }
243
244 // Two word header: data length and padding for object alignment.
245 static const intptr_t kHeaderSize = 2 * kWordSize;
246
247 private:
248 const void* raw_memory_; // The symbol kDataSnapshot.
249
250 DISALLOW_COPY_AND_ASSIGN(DataSnapshot);
251 };
252
253
227 class BaseReader { 254 class BaseReader {
228 public: 255 public:
229 BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {} 256 BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {}
230 // Reads raw data (for basic types). 257 // Reads raw data (for basic types).
231 // sizeof(T) must be in {1,2,4,8}. 258 // sizeof(T) must be in {1,2,4,8}.
232 template <typename T> 259 template <typename T>
233 T Read() { 260 T Read() {
234 return ReadStream::Raw<sizeof(T), T>::Read(&stream_); 261 return ReadStream::Raw<sizeof(T), T>::Read(&stream_);
235 } 262 }
236 263
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 private: 353 private:
327 Object* reference_; 354 Object* reference_;
328 DeserializeState state_; 355 DeserializeState state_;
329 bool defer_canonicalization_; 356 bool defer_canonicalization_;
330 ZoneGrowableArray<intptr_t>* patch_records_; 357 ZoneGrowableArray<intptr_t>* patch_records_;
331 }; 358 };
332 359
333 360
334 class InstructionsReader : public ZoneAllocated { 361 class InstructionsReader : public ZoneAllocated {
335 public: 362 public:
336 explicit InstructionsReader(const uint8_t* buffer) 363 InstructionsReader(const uint8_t* instructions_buffer,
337 : buffer_(buffer) { 364 const uint8_t* data_buffer)
338 ASSERT(buffer != NULL); 365 : instructions_buffer_(instructions_buffer),
339 ASSERT(Utils::IsAligned(reinterpret_cast<uword>(buffer), 366 data_buffer_(data_buffer) {
367 ASSERT(instructions_buffer != NULL);
368 ASSERT(data_buffer != NULL);
369 ASSERT(Utils::IsAligned(reinterpret_cast<uword>(instructions_buffer),
340 OS::PreferredCodeAlignment())); 370 OS::PreferredCodeAlignment()));
341 } 371 }
342 372
343 RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags); 373 RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags);
374 RawObject* GetObjectAt(int32_t offset);
344 375
345 private: 376 private:
346 const uint8_t* buffer_; 377 const uint8_t* instructions_buffer_;
378 const uint8_t* data_buffer_;
347 379
348 DISALLOW_COPY_AND_ASSIGN(InstructionsReader); 380 DISALLOW_COPY_AND_ASSIGN(InstructionsReader);
349 }; 381 };
350 382
351 383
352 // Reads a snapshot into objects. 384 // Reads a snapshot into objects.
353 class SnapshotReader : public BaseReader { 385 class SnapshotReader : public BaseReader {
354 public: 386 public:
355 Thread* thread() const { return thread_; } 387 Thread* thread() const { return thread_; }
356 Zone* zone() const { return zone_; } 388 Zone* zone() const { return zone_; }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 RawUnhandledException* NewUnhandledException(); 478 RawUnhandledException* NewUnhandledException();
447 RawObject* NewInteger(int64_t value); 479 RawObject* NewInteger(int64_t value);
448 RawStacktrace* NewStacktrace(); 480 RawStacktrace* NewStacktrace();
449 RawWeakProperty* NewWeakProperty(); 481 RawWeakProperty* NewWeakProperty();
450 RawJSRegExp* NewJSRegExp(); 482 RawJSRegExp* NewJSRegExp();
451 483
452 RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags) { 484 RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags) {
453 return instructions_reader_->GetInstructionsAt(offset, expected_tags); 485 return instructions_reader_->GetInstructionsAt(offset, expected_tags);
454 } 486 }
455 487
488 RawObject* GetObjectAt(int32_t offset) {
489 return instructions_reader_->GetObjectAt(offset);
490 }
491
456 const uint8_t* instructions_buffer_; 492 const uint8_t* instructions_buffer_;
493 const uint8_t* data_buffer_;
457 494
458 protected: 495 protected:
459 SnapshotReader(const uint8_t* buffer, 496 SnapshotReader(const uint8_t* buffer,
460 intptr_t size, 497 intptr_t size,
461 const uint8_t* instructions_buffer, 498 const uint8_t* instructions_buffer,
499 const uint8_t* data_buffer,
462 Snapshot::Kind kind, 500 Snapshot::Kind kind,
463 ZoneGrowableArray<BackRefNode>* backward_references, 501 ZoneGrowableArray<BackRefNode>* backward_references,
464 Thread* thread); 502 Thread* thread);
465 ~SnapshotReader() { } 503 ~SnapshotReader() { }
466 504
467 ZoneGrowableArray<BackRefNode>* GetBackwardReferenceTable() const { 505 ZoneGrowableArray<BackRefNode>* GetBackwardReferenceTable() const {
468 return backward_references_; 506 return backward_references_;
469 } 507 }
470 void ResetBackwardReferenceTable() { backward_references_ = NULL; } 508 void ResetBackwardReferenceTable() { backward_references_ = NULL; }
471 PageSpace* old_space() const { return old_space_; } 509 PageSpace* old_space() const { return old_space_; }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 friend class WeakProperty; 634 friend class WeakProperty;
597 DISALLOW_COPY_AND_ASSIGN(SnapshotReader); 635 DISALLOW_COPY_AND_ASSIGN(SnapshotReader);
598 }; 636 };
599 637
600 638
601 class VmIsolateSnapshotReader : public SnapshotReader { 639 class VmIsolateSnapshotReader : public SnapshotReader {
602 public: 640 public:
603 VmIsolateSnapshotReader(const uint8_t* buffer, 641 VmIsolateSnapshotReader(const uint8_t* buffer,
604 intptr_t size, 642 intptr_t size,
605 const uint8_t* instructions_buffer, 643 const uint8_t* instructions_buffer,
644 const uint8_t* data_buffer,
606 Thread* thread); 645 Thread* thread);
607 ~VmIsolateSnapshotReader(); 646 ~VmIsolateSnapshotReader();
608 647
609 RawApiError* ReadVmIsolateSnapshot(); 648 RawApiError* ReadVmIsolateSnapshot();
610 649
611 private: 650 private:
612 DISALLOW_COPY_AND_ASSIGN(VmIsolateSnapshotReader); 651 DISALLOW_COPY_AND_ASSIGN(VmIsolateSnapshotReader);
613 }; 652 };
614 653
615 654
616 class IsolateSnapshotReader : public SnapshotReader { 655 class IsolateSnapshotReader : public SnapshotReader {
617 public: 656 public:
618 IsolateSnapshotReader(const uint8_t* buffer, 657 IsolateSnapshotReader(const uint8_t* buffer,
619 intptr_t size, 658 intptr_t size,
620 const uint8_t* instructions_buffer, 659 const uint8_t* instructions_buffer,
660 const uint8_t* data_buffer,
621 Thread* thread); 661 Thread* thread);
622 ~IsolateSnapshotReader(); 662 ~IsolateSnapshotReader();
623 663
624 private: 664 private:
625 DISALLOW_COPY_AND_ASSIGN(IsolateSnapshotReader); 665 DISALLOW_COPY_AND_ASSIGN(IsolateSnapshotReader);
626 }; 666 };
627 667
628 668
629 class ScriptSnapshotReader : public SnapshotReader { 669 class ScriptSnapshotReader : public SnapshotReader {
630 public: 670 public:
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 }; 839 };
800 840
801 841
802 class InstructionsWriter : public ZoneAllocated { 842 class InstructionsWriter : public ZoneAllocated {
803 public: 843 public:
804 InstructionsWriter(uint8_t** buffer, 844 InstructionsWriter(uint8_t** buffer,
805 ReAlloc alloc, 845 ReAlloc alloc,
806 intptr_t initial_size) 846 intptr_t initial_size)
807 : stream_(buffer, alloc, initial_size), 847 : stream_(buffer, alloc, initial_size),
808 next_offset_(InstructionsSnapshot::kHeaderSize), 848 next_offset_(InstructionsSnapshot::kHeaderSize),
849 next_object_offset_(DataSnapshot::kHeaderSize),
809 binary_size_(0), 850 binary_size_(0),
810 instructions_() { 851 instructions_(),
852 objects_() {
811 ASSERT(buffer != NULL); 853 ASSERT(buffer != NULL);
812 ASSERT(alloc != NULL); 854 ASSERT(alloc != NULL);
813 } 855 }
814 856
815 // Size of the snapshot (assembly code). 857 // Size of the snapshot (assembly code).
816 intptr_t BytesWritten() const { return stream_.bytes_written(); } 858 intptr_t BytesWritten() const { return stream_.bytes_written(); }
817 859
818 intptr_t binary_size() { return binary_size_; } 860 intptr_t binary_size() { return binary_size_; }
819 861
820 int32_t GetOffsetFor(RawInstructions* instructions); 862 int32_t GetOffsetFor(RawInstructions* instructions);
821 863
864 int32_t GetObjectOffsetFor(RawObject* raw_object);
865
822 void SetInstructionsCode(RawInstructions* insns, RawCode* code) { 866 void SetInstructionsCode(RawInstructions* insns, RawCode* code) {
823 for (intptr_t i = 0; i < instructions_.length(); i++) { 867 for (intptr_t i = 0; i < instructions_.length(); i++) {
824 if (instructions_[i].raw_insns_ == insns) { 868 if (instructions_[i].raw_insns_ == insns) {
825 instructions_[i].raw_code_ = code; 869 instructions_[i].raw_code_ = code;
826 return; 870 return;
827 } 871 }
828 } 872 }
829 UNREACHABLE(); 873 UNREACHABLE();
830 } 874 }
831 875
832 void WriteAssembly(); 876 void WriteAssembly();
833 877
834 private: 878 private:
835 struct InstructionsData { 879 struct InstructionsData {
836 explicit InstructionsData(RawInstructions* insns) 880 explicit InstructionsData(RawInstructions* insns)
837 : raw_insns_(insns), raw_code_(NULL) { } 881 : raw_insns_(insns), raw_code_(NULL) { }
838 882
839 union { 883 union {
840 RawInstructions* raw_insns_; 884 RawInstructions* raw_insns_;
841 const Instructions* insns_; 885 const Instructions* insns_;
842 }; 886 };
843 union { 887 union {
844 RawCode* raw_code_; 888 RawCode* raw_code_;
845 const Code* code_; 889 const Code* code_;
846 }; 890 };
847 }; 891 };
848 892
893 struct ObjectData {
894 explicit ObjectData(RawObject* raw_obj)
895 : raw_obj_(raw_obj) { }
896
897 union {
898 RawObject* raw_obj_;
899 const Object* obj_;
900 };
901 };
902
849 void WriteWordLiteral(uword value) { 903 void WriteWordLiteral(uword value) {
850 // Padding is helpful for comparing the .S with --disassemble. 904 // Padding is helpful for comparing the .S with --disassemble.
851 #if defined(ARCH_IS_64_BIT) 905 #if defined(ARCH_IS_64_BIT)
852 stream_.Print(".quad 0x%0.16" Px "\n", value); 906 stream_.Print(".quad 0x%0.16" Px "\n", value);
853 #else 907 #else
854 stream_.Print(".long 0x%0.8" Px "\n", value); 908 stream_.Print(".long 0x%0.8" Px "\n", value);
855 #endif 909 #endif
856 binary_size_ += sizeof(value); 910 binary_size_ += sizeof(value);
857 } 911 }
858 912
859 WriteStream stream_; 913 WriteStream stream_;
860 intptr_t next_offset_; 914 intptr_t next_offset_;
915 intptr_t next_object_offset_;
861 intptr_t binary_size_; 916 intptr_t binary_size_;
862 GrowableArray<InstructionsData> instructions_; 917 GrowableArray<InstructionsData> instructions_;
918 GrowableArray<ObjectData> objects_;
863 919
864 DISALLOW_COPY_AND_ASSIGN(InstructionsWriter); 920 DISALLOW_COPY_AND_ASSIGN(InstructionsWriter);
865 }; 921 };
866 922
867 923
868 class SnapshotWriter : public BaseWriter { 924 class SnapshotWriter : public BaseWriter {
869 protected: 925 protected:
870 SnapshotWriter(Snapshot::Kind kind, 926 SnapshotWriter(Snapshot::Kind kind,
871 Thread* thread, 927 Thread* thread,
872 uint8_t** buffer, 928 uint8_t** buffer,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 964
909 // Write a version string for the snapshot. 965 // Write a version string for the snapshot.
910 void WriteVersion(); 966 void WriteVersion();
911 967
912 static intptr_t FirstObjectId(); 968 static intptr_t FirstObjectId();
913 969
914 int32_t GetInstructionsId(RawInstructions* instructions) { 970 int32_t GetInstructionsId(RawInstructions* instructions) {
915 return instructions_writer_->GetOffsetFor(instructions); 971 return instructions_writer_->GetOffsetFor(instructions);
916 } 972 }
917 973
974 int32_t GetObjectId(RawObject* raw) {
975 return instructions_writer_->GetObjectOffsetFor(raw);
976 }
977
918 void SetInstructionsCode(RawInstructions* instructions, RawCode* code) { 978 void SetInstructionsCode(RawInstructions* instructions, RawCode* code) {
919 return instructions_writer_->SetInstructionsCode(instructions, code); 979 return instructions_writer_->SetInstructionsCode(instructions, code);
920 } 980 }
921 981
922 void WriteFunctionId(RawFunction* func, bool owner_is_class); 982 void WriteFunctionId(RawFunction* func, bool owner_is_class);
923 983
924 protected: 984 protected:
925 bool CheckAndWritePredefinedObject(RawObject* raw); 985 bool CheckAndWritePredefinedObject(RawObject* raw);
926 bool HandleVMIsolateObject(RawObject* raw); 986 bool HandleVMIsolateObject(RawObject* raw);
927 987
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 private: 1188 private:
1129 SnapshotWriter* writer_; 1189 SnapshotWriter* writer_;
1130 bool as_references_; 1190 bool as_references_;
1131 1191
1132 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); 1192 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor);
1133 }; 1193 };
1134 1194
1135 } // namespace dart 1195 } // namespace dart
1136 1196
1137 #endif // VM_SNAPSHOT_H_ 1197 #endif // VM_SNAPSHOT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698