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

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

Issue 1345053003: Write the contents of ICData and ObjectPools more eagerly and the contents of Code and Functions (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 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 | « no previous file | 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 #include "vm/native_entry.h" 5 #include "vm/native_entry.h"
6 #include "vm/object.h" 6 #include "vm/object.h"
7 #include "vm/object_store.h" 7 #include "vm/object_store.h"
8 #include "vm/snapshot.h" 8 #include "vm/snapshot.h"
9 #include "vm/stub_code.h" 9 #include "vm/stub_code.h"
10 #include "vm/symbols.h" 10 #include "vm/symbols.h"
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 Snapshot::Kind kind) { 534 Snapshot::Kind kind) {
535 ASSERT(reader != NULL); 535 ASSERT(reader != NULL);
536 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 536 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
537 537
538 // Allocate closure data object. 538 // Allocate closure data object.
539 ClosureData& data = ClosureData::ZoneHandle( 539 ClosureData& data = ClosureData::ZoneHandle(
540 reader->zone(), NEW_OBJECT(ClosureData)); 540 reader->zone(), NEW_OBJECT(ClosureData));
541 reader->AddBackRef(object_id, &data, kIsDeserialized); 541 reader->AddBackRef(object_id, &data, kIsDeserialized);
542 542
543 // Set all the object fields. 543 // Set all the object fields.
544 READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(), kAsReference); 544 READ_OBJECT_FIELDS(data,
545 data.raw()->from(), data.raw()->to(),
546 kAsInlinedObject);
545 547
546 return data.raw(); 548 return data.raw();
547 } 549 }
548 550
549 551
550 void RawClosureData::WriteTo(SnapshotWriter* writer, 552 void RawClosureData::WriteTo(SnapshotWriter* writer,
551 intptr_t object_id, 553 intptr_t object_id,
552 Snapshot::Kind kind) { 554 Snapshot::Kind kind) {
553 ASSERT(writer != NULL); 555 ASSERT(writer != NULL);
554 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 556 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 Snapshot::Kind kind) { 592 Snapshot::Kind kind) {
591 ASSERT(reader != NULL); 593 ASSERT(reader != NULL);
592 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 594 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
593 595
594 // Allocate redirection data object. 596 // Allocate redirection data object.
595 RedirectionData& data = RedirectionData::ZoneHandle( 597 RedirectionData& data = RedirectionData::ZoneHandle(
596 reader->zone(), NEW_OBJECT(RedirectionData)); 598 reader->zone(), NEW_OBJECT(RedirectionData));
597 reader->AddBackRef(object_id, &data, kIsDeserialized); 599 reader->AddBackRef(object_id, &data, kIsDeserialized);
598 600
599 // Set all the object fields. 601 // Set all the object fields.
600 READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(), kAsReference); 602 READ_OBJECT_FIELDS(data,
603 data.raw()->from(), data.raw()->to(),
604 kAsReference);
601 605
602 return data.raw(); 606 return data.raw();
603 } 607 }
604 608
605 609
606 void RawRedirectionData::WriteTo(SnapshotWriter* writer, 610 void RawRedirectionData::WriteTo(SnapshotWriter* writer,
607 intptr_t object_id, 611 intptr_t object_id,
608 Snapshot::Kind kind) { 612 Snapshot::Kind kind) {
609 ASSERT(writer != NULL); 613 ASSERT(writer != NULL);
610 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 614 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 func.set_optimized_instruction_count(reader->Read<uint16_t>()); 651 func.set_optimized_instruction_count(reader->Read<uint16_t>());
648 func.set_optimized_call_site_count(reader->Read<uint16_t>()); 652 func.set_optimized_call_site_count(reader->Read<uint16_t>());
649 653
650 // Set all the object fields. 654 // Set all the object fields.
651 bool is_optimized = func.usage_counter() != 0; 655 bool is_optimized = func.usage_counter() != 0;
652 RawObject** toobj = reader->snapshot_code() ? func.raw()->to() : 656 RawObject** toobj = reader->snapshot_code() ? func.raw()->to() :
653 (is_optimized ? func.raw()->to_optimized_snapshot() : 657 (is_optimized ? func.raw()->to_optimized_snapshot() :
654 func.raw()->to_snapshot()); 658 func.raw()->to_snapshot());
655 READ_OBJECT_FIELDS(func, 659 READ_OBJECT_FIELDS(func,
656 func.raw()->from(), toobj, 660 func.raw()->from(), toobj,
657 kAsInlinedObject); 661 kAsReference);
658 if (!reader->snapshot_code()) { 662 if (!reader->snapshot_code()) {
659 // Initialize all fields that are not part of the snapshot. 663 // Initialize all fields that are not part of the snapshot.
660 if (!is_optimized) { 664 if (!is_optimized) {
661 func.ClearICDataArray(); 665 func.ClearICDataArray();
662 } 666 }
663 func.ClearCode(); 667 func.ClearCode();
664 } else { 668 } else {
665 // Fix entry point. 669 // Fix entry point.
666 (*reader->CodeHandle()) = func.CurrentCode(); 670 (*reader->CodeHandle()) = func.CurrentCode();
667 uword new_entry = (*reader->CodeHandle()).EntryPoint(); 671 uword new_entry = (*reader->CodeHandle()).EntryPoint();
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 writer->Write<int16_t>(ptr()->num_optional_parameters_); 723 writer->Write<int16_t>(ptr()->num_optional_parameters_);
720 writer->Write<int16_t>(ptr()->deoptimization_counter_); 724 writer->Write<int16_t>(ptr()->deoptimization_counter_);
721 writer->Write<uint32_t>(ptr()->kind_tag_); 725 writer->Write<uint32_t>(ptr()->kind_tag_);
722 writer->Write<uint16_t>(ptr()->optimized_instruction_count_); 726 writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
723 writer->Write<uint16_t>(ptr()->optimized_call_site_count_); 727 writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
724 728
725 // Write out all the object pointer fields. 729 // Write out all the object pointer fields.
726 RawObject** toobj = 730 RawObject** toobj =
727 writer->snapshot_code() ? to() : 731 writer->snapshot_code() ? to() :
728 (is_optimized ? to_optimized_snapshot() : to_snapshot()); 732 (is_optimized ? to_optimized_snapshot() : to_snapshot());
729 SnapshotWriterVisitor visitor(writer, kAsInlinedObject); 733 SnapshotWriterVisitor visitor(writer, kAsReference);
730 visitor.VisitPointers(from(), toobj); 734 visitor.VisitPointers(from(), toobj);
731 } else { 735 } else {
732 writer->WriteFunctionId(this, owner_is_class); 736 writer->WriteFunctionId(this, owner_is_class);
733 } 737 }
734 } 738 }
735 739
736 740
737 RawField* Field::ReadFrom(SnapshotReader* reader, 741 RawField* Field::ReadFrom(SnapshotReader* reader,
738 intptr_t object_id, 742 intptr_t object_id,
739 intptr_t tags, 743 intptr_t tags,
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0)); 1197 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0));
1194 reader->AddBackRef(object_id, &result, kIsDeserialized); 1198 reader->AddBackRef(object_id, &result, kIsDeserialized);
1195 1199
1196 result.set_compile_timestamp(reader->Read<int64_t>()); 1200 result.set_compile_timestamp(reader->Read<int64_t>());
1197 result.set_state_bits(reader->Read<int32_t>()); 1201 result.set_state_bits(reader->Read<int32_t>());
1198 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>()); 1202 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>());
1199 1203
1200 // Set all the object fields. 1204 // Set all the object fields.
1201 READ_OBJECT_FIELDS(result, 1205 READ_OBJECT_FIELDS(result,
1202 result.raw()->from(), result.raw()->to(), 1206 result.raw()->from(), result.raw()->to(),
1203 kAsInlinedObject); 1207 kAsReference);
1204 1208
1205 // Fix entry point. 1209 // Fix entry point.
1206 uword new_entry = result.EntryPoint(); 1210 uword new_entry = result.EntryPoint();
1207 ASSERT(Dart::vm_isolate()->heap()->CodeContains(new_entry)); 1211 ASSERT(Dart::vm_isolate()->heap()->CodeContains(new_entry));
1208 result.StoreNonPointer(&result.raw_ptr()->entry_point_, new_entry); 1212 result.StoreNonPointer(&result.raw_ptr()->entry_point_, new_entry);
1209 1213
1210 return result.raw(); 1214 return result.raw();
1211 } 1215 }
1212 1216
1213 1217
(...skipping 16 matching lines...) Expand all
1230 // Write out the class and tags information. 1234 // Write out the class and tags information.
1231 writer->WriteVMIsolateObject(kCodeCid); 1235 writer->WriteVMIsolateObject(kCodeCid);
1232 writer->WriteTags(writer->GetObjectTags(this)); 1236 writer->WriteTags(writer->GetObjectTags(this));
1233 1237
1234 // Write out all the non object fields. 1238 // Write out all the non object fields.
1235 writer->Write<int64_t>(ptr()->compile_timestamp_); 1239 writer->Write<int64_t>(ptr()->compile_timestamp_);
1236 writer->Write<int32_t>(ptr()->state_bits_); 1240 writer->Write<int32_t>(ptr()->state_bits_);
1237 writer->Write<int32_t>(ptr()->lazy_deopt_pc_offset_); 1241 writer->Write<int32_t>(ptr()->lazy_deopt_pc_offset_);
1238 1242
1239 // Write out all the object pointer fields. 1243 // Write out all the object pointer fields.
1240 SnapshotWriterVisitor visitor(writer, kAsInlinedObject); 1244 SnapshotWriterVisitor visitor(writer, kAsReference);
1241 visitor.VisitPointers(from(), to()); 1245 visitor.VisitPointers(from(), to());
1242 1246
1243 writer->SetInstructionsCode(ptr()->instructions_, this); 1247 writer->SetInstructionsCode(ptr()->instructions_, this);
1244 } 1248 }
1245 1249
1246 1250
1247 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, 1251 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader,
1248 intptr_t object_id, 1252 intptr_t object_id,
1249 intptr_t tags, 1253 intptr_t tags,
1250 Snapshot::Kind kind) { 1254 Snapshot::Kind kind) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 TypedData::Handle(reader->NewTypedData(kTypedDataInt8ArrayCid, length)); 1306 TypedData::Handle(reader->NewTypedData(kTypedDataInt8ArrayCid, length));
1303 result.set_info_array(info_array); 1307 result.set_info_array(info_array);
1304 1308
1305 NoSafepointScope no_safepoint; 1309 NoSafepointScope no_safepoint;
1306 for (intptr_t i = 0; i < length; i++) { 1310 for (intptr_t i = 0; i < length; i++) {
1307 ObjectPool::EntryType entry_type = 1311 ObjectPool::EntryType entry_type =
1308 static_cast<ObjectPool::EntryType>(reader->Read<int8_t>()); 1312 static_cast<ObjectPool::EntryType>(reader->Read<int8_t>());
1309 *reinterpret_cast<int8_t*>(info_array.DataAddr(i)) = entry_type; 1313 *reinterpret_cast<int8_t*>(info_array.DataAddr(i)) = entry_type;
1310 switch (entry_type) { 1314 switch (entry_type) {
1311 case ObjectPool::kTaggedObject: { 1315 case ObjectPool::kTaggedObject: {
1312 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); 1316 (*reader->PassiveObjectHandle()) =
1317 reader->ReadObjectImpl(kAsInlinedObject);
1313 result.SetObjectAt(i, *(reader->PassiveObjectHandle())); 1318 result.SetObjectAt(i, *(reader->PassiveObjectHandle()));
1314 break; 1319 break;
1315 } 1320 }
1316 case ObjectPool::kImmediate: { 1321 case ObjectPool::kImmediate: {
1317 intptr_t raw_value = reader->Read<intptr_t>(); 1322 intptr_t raw_value = reader->Read<intptr_t>();
1318 result.SetRawValueAt(i, raw_value); 1323 result.SetRawValueAt(i, raw_value);
1319 break; 1324 break;
1320 } 1325 }
1321 case ObjectPool::kNativeEntry: { 1326 case ObjectPool::kNativeEntry: {
1322 // Read nothing. Initialize with the lazy link entry. 1327 // Read nothing. Initialize with the lazy link entry.
(...skipping 28 matching lines...) Expand all
1351 ASSERT(info_array != TypedData::null()); 1356 ASSERT(info_array != TypedData::null());
1352 1357
1353 writer->Write<intptr_t>(length); 1358 writer->Write<intptr_t>(length);
1354 for (intptr_t i = 0; i < length; i++) { 1359 for (intptr_t i = 0; i < length; i++) {
1355 ObjectPool::EntryType entry_type = 1360 ObjectPool::EntryType entry_type =
1356 static_cast<ObjectPool::EntryType>(info_array->data()[i]); 1361 static_cast<ObjectPool::EntryType>(info_array->data()[i]);
1357 writer->Write<int8_t>(entry_type); 1362 writer->Write<int8_t>(entry_type);
1358 Entry& entry = ptr()->data()[i]; 1363 Entry& entry = ptr()->data()[i];
1359 switch (entry_type) { 1364 switch (entry_type) {
1360 case ObjectPool::kTaggedObject: { 1365 case ObjectPool::kTaggedObject: {
1361 writer->WriteObjectImpl(entry.raw_obj_, kAsReference); 1366 writer->WriteObjectImpl(entry.raw_obj_, kAsInlinedObject);
1362 break; 1367 break;
1363 } 1368 }
1364 case ObjectPool::kImmediate: { 1369 case ObjectPool::kImmediate: {
1365 writer->Write<intptr_t>(entry.raw_value_); 1370 writer->Write<intptr_t>(entry.raw_value_);
1366 break; 1371 break;
1367 } 1372 }
1368 case ObjectPool::kNativeEntry: { 1373 case ObjectPool::kNativeEntry: {
1369 // Write nothing. Will initialize with the lazy link entry. 1374 // Write nothing. Will initialize with the lazy link entry.
1370 break; 1375 break;
1371 } 1376 }
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 1704
1700 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); 1705 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData));
1701 reader->AddBackRef(object_id, &result, kIsDeserialized); 1706 reader->AddBackRef(object_id, &result, kIsDeserialized);
1702 1707
1703 result.set_deopt_id(reader->Read<int32_t>()); 1708 result.set_deopt_id(reader->Read<int32_t>());
1704 result.set_state_bits(reader->Read<uint32_t>()); 1709 result.set_state_bits(reader->Read<uint32_t>());
1705 1710
1706 // Set all the object fields. 1711 // Set all the object fields.
1707 READ_OBJECT_FIELDS(result, 1712 READ_OBJECT_FIELDS(result,
1708 result.raw()->from(), result.raw()->to(), 1713 result.raw()->from(), result.raw()->to(),
1709 kAsReference); 1714 kAsInlinedObject);
1710 1715
1711 return result.raw(); 1716 return result.raw();
1712 } 1717 }
1713 1718
1714 1719
1715 void RawICData::WriteTo(SnapshotWriter* writer, 1720 void RawICData::WriteTo(SnapshotWriter* writer,
1716 intptr_t object_id, 1721 intptr_t object_id,
1717 Snapshot::Kind kind) { 1722 Snapshot::Kind kind) {
1718 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1723 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1719 1724
1720 // Write out the serialization header value for this object. 1725 // Write out the serialization header value for this object.
1721 writer->WriteInlinedObjectHeader(object_id); 1726 writer->WriteInlinedObjectHeader(object_id);
1722 1727
1723 // Write out the class and tags information. 1728 // Write out the class and tags information.
1724 writer->WriteVMIsolateObject(kICDataCid); 1729 writer->WriteVMIsolateObject(kICDataCid);
1725 writer->WriteTags(writer->GetObjectTags(this)); 1730 writer->WriteTags(writer->GetObjectTags(this));
1726 1731
1727 // Write out all the non object fields. 1732 // Write out all the non object fields.
1728 writer->Write<int32_t>(ptr()->deopt_id_); 1733 writer->Write<int32_t>(ptr()->deopt_id_);
1729 writer->Write<uint32_t>(ptr()->state_bits_); 1734 writer->Write<uint32_t>(ptr()->state_bits_);
1730 1735
1731 // Write out all the object pointer fields. 1736 // Write out all the object pointer fields.
1732 SnapshotWriterVisitor visitor(writer); 1737 SnapshotWriterVisitor visitor(writer, kAsInlinedObject);
Florian Schneider 2015/09/23 12:23:39 I think it would be safer to get rid of the defaul
rmacnak 2015/09/23 18:12:04 Done.
1733 visitor.VisitPointers(from(), to()); 1738 visitor.VisitPointers(from(), to());
1734 } 1739 }
1735 1740
1736 1741
1737 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader, 1742 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader,
1738 intptr_t object_id, 1743 intptr_t object_id,
1739 intptr_t tags, 1744 intptr_t tags,
1740 Snapshot::Kind kind) { 1745 Snapshot::Kind kind) {
1741 ASSERT(reader->snapshot_code()); 1746 ASSERT(reader->snapshot_code());
1742 ASSERT(kind == Snapshot::kFull); 1747 ASSERT(kind == Snapshot::kFull);
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
2110 ASSERT(writer != NULL); 2115 ASSERT(writer != NULL);
2111 2116
2112 // Write out the serialization header value for this object. 2117 // Write out the serialization header value for this object.
2113 writer->WriteInlinedObjectHeader(object_id); 2118 writer->WriteInlinedObjectHeader(object_id);
2114 2119
2115 // Write out the class and tags information. 2120 // Write out the class and tags information.
2116 writer->WriteIndexedObject(kBigintCid); 2121 writer->WriteIndexedObject(kBigintCid);
2117 writer->WriteTags(writer->GetObjectTags(this)); 2122 writer->WriteTags(writer->GetObjectTags(this));
2118 2123
2119 // Write out all the object pointer fields. 2124 // Write out all the object pointer fields.
2120 SnapshotWriterVisitor visitor(writer, false); 2125 SnapshotWriterVisitor visitor(writer, false);
Florian Schneider 2015/09/23 12:23:39 s/false/kInlinedObject/
rmacnak 2015/09/23 18:12:04 Done.
2121 visitor.VisitPointers(from(), to()); 2126 visitor.VisitPointers(from(), to());
2122 } 2127 }
2123 2128
2124 2129
2125 RawDouble* Double::ReadFrom(SnapshotReader* reader, 2130 RawDouble* Double::ReadFrom(SnapshotReader* reader,
2126 intptr_t object_id, 2131 intptr_t object_id,
2127 intptr_t tags, 2132 intptr_t tags,
2128 Snapshot::Kind kind) { 2133 Snapshot::Kind kind) {
2129 ASSERT(reader != NULL); 2134 ASSERT(reader != NULL);
2130 ASSERT(kind != Snapshot::kMessage); 2135 ASSERT(kind != Snapshot::kMessage);
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after
3278 // We do not allow objects with native fields in an isolate message. 3283 // We do not allow objects with native fields in an isolate message.
3279 writer->SetWriteException(Exceptions::kArgument, 3284 writer->SetWriteException(Exceptions::kArgument,
3280 "Illegal argument in isolate message" 3285 "Illegal argument in isolate message"
3281 " : (object is a UserTag)"); 3286 " : (object is a UserTag)");
3282 } else { 3287 } else {
3283 UNREACHABLE(); 3288 UNREACHABLE();
3284 } 3289 }
3285 } 3290 }
3286 3291
3287 } // namespace dart 3292 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698