OLD | NEW |
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/snapshot.h" | 5 #include "vm/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 942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 RawUnresolvedClass* SnapshotReader::NewUnresolvedClass() { | 953 RawUnresolvedClass* SnapshotReader::NewUnresolvedClass() { |
954 ALLOC_NEW_OBJECT(UnresolvedClass); | 954 ALLOC_NEW_OBJECT(UnresolvedClass); |
955 } | 955 } |
956 | 956 |
957 | 957 |
958 RawType* SnapshotReader::NewType() { | 958 RawType* SnapshotReader::NewType() { |
959 ALLOC_NEW_OBJECT(Type); | 959 ALLOC_NEW_OBJECT(Type); |
960 } | 960 } |
961 | 961 |
962 | 962 |
963 RawFunctionType* SnapshotReader::NewFunctionType() { | |
964 ALLOC_NEW_OBJECT(FunctionType); | |
965 } | |
966 | |
967 | |
968 RawTypeRef* SnapshotReader::NewTypeRef() { | 963 RawTypeRef* SnapshotReader::NewTypeRef() { |
969 ALLOC_NEW_OBJECT(TypeRef); | 964 ALLOC_NEW_OBJECT(TypeRef); |
970 } | 965 } |
971 | 966 |
972 | 967 |
973 RawTypeParameter* SnapshotReader::NewTypeParameter() { | 968 RawTypeParameter* SnapshotReader::NewTypeParameter() { |
974 ALLOC_NEW_OBJECT(TypeParameter); | 969 ALLOC_NEW_OBJECT(TypeParameter); |
975 } | 970 } |
976 | 971 |
977 | 972 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1171 ((c >= 'A') && (c <= 'Z')) || | 1166 ((c >= 'A') && (c <= 'Z')) || |
1172 ((c >= '0') && (c <= '9'))) { | 1167 ((c >= '0') && (c <= '9'))) { |
1173 continue; | 1168 continue; |
1174 } | 1169 } |
1175 *label = '_'; | 1170 *label = '_'; |
1176 } | 1171 } |
1177 } | 1172 } |
1178 | 1173 |
1179 | 1174 |
1180 void InstructionsWriter::WriteAssembly() { | 1175 void InstructionsWriter::WriteAssembly() { |
1181 Zone* Z = Thread::Current()->zone(); | 1176 Zone* zone = Thread::Current()->zone(); |
1182 | 1177 |
1183 // Handlify collected raw pointers as building the names below | 1178 // Handlify collected raw pointers as building the names below |
1184 // will allocate on the Dart heap. | 1179 // will allocate on the Dart heap. |
1185 for (intptr_t i = 0; i < instructions_.length(); i++) { | 1180 for (intptr_t i = 0; i < instructions_.length(); i++) { |
1186 InstructionsData& data = instructions_[i]; | 1181 InstructionsData& data = instructions_[i]; |
1187 data.insns_ = &Instructions::Handle(Z, data.raw_insns_); | 1182 data.insns_ = &Instructions::Handle(zone, data.raw_insns_); |
1188 ASSERT(data.raw_code_ != NULL); | 1183 ASSERT(data.raw_code_ != NULL); |
1189 data.code_ = &Code::Handle(Z, data.raw_code_); | 1184 data.code_ = &Code::Handle(zone, data.raw_code_); |
1190 } | 1185 } |
1191 for (intptr_t i = 0; i < objects_.length(); i++) { | 1186 for (intptr_t i = 0; i < objects_.length(); i++) { |
1192 ObjectData& data = objects_[i]; | 1187 ObjectData& data = objects_[i]; |
1193 data.obj_ = &Object::Handle(Z, data.raw_obj_); | 1188 data.obj_ = &Object::Handle(zone, data.raw_obj_); |
1194 } | 1189 } |
1195 | 1190 |
1196 stream_.Print(".text\n"); | 1191 stream_.Print(".text\n"); |
1197 stream_.Print(".globl _kInstructionsSnapshot\n"); | 1192 stream_.Print(".globl _kInstructionsSnapshot\n"); |
1198 // Start snapshot at page boundary. | 1193 // Start snapshot at page boundary. |
1199 ASSERT(VirtualMemory::PageSize() >= OS::kMaxPreferredCodeAlignment); | 1194 ASSERT(VirtualMemory::PageSize() >= OS::kMaxPreferredCodeAlignment); |
1200 stream_.Print(".balign %" Pd ", 0\n", VirtualMemory::PageSize()); | 1195 stream_.Print(".balign %" Pd ", 0\n", VirtualMemory::PageSize()); |
1201 stream_.Print("_kInstructionsSnapshot:\n"); | 1196 stream_.Print("_kInstructionsSnapshot:\n"); |
1202 | 1197 |
1203 // This head also provides the gap to make the instructions snapshot | 1198 // This head also provides the gap to make the instructions snapshot |
1204 // look like a HeapPage. | 1199 // look like a HeapPage. |
1205 intptr_t instructions_length = next_offset_; | 1200 intptr_t instructions_length = next_offset_; |
1206 WriteWordLiteral(instructions_length); | 1201 WriteWordLiteral(instructions_length); |
1207 intptr_t header_words = InstructionsSnapshot::kHeaderSize / sizeof(uword); | 1202 intptr_t header_words = InstructionsSnapshot::kHeaderSize / sizeof(uword); |
1208 for (intptr_t i = 1; i < header_words; i++) { | 1203 for (intptr_t i = 1; i < header_words; i++) { |
1209 WriteWordLiteral(0); | 1204 WriteWordLiteral(0); |
1210 } | 1205 } |
1211 | 1206 |
1212 Object& owner = Object::Handle(Z); | 1207 Object& owner = Object::Handle(zone); |
1213 String& str = String::Handle(Z); | 1208 String& str = String::Handle(zone); |
1214 | 1209 |
1215 for (intptr_t i = 0; i < instructions_.length(); i++) { | 1210 for (intptr_t i = 0; i < instructions_.length(); i++) { |
1216 const Instructions& insns = *instructions_[i].insns_; | 1211 const Instructions& insns = *instructions_[i].insns_; |
1217 const Code& code = *instructions_[i].code_; | 1212 const Code& code = *instructions_[i].code_; |
1218 | 1213 |
1219 ASSERT(insns.raw()->Size() % sizeof(uint64_t) == 0); | 1214 ASSERT(insns.raw()->Size() % sizeof(uint64_t) == 0); |
1220 | 1215 |
1221 { | 1216 { |
1222 // 1. Write from the header to the entry point. | 1217 // 1. Write from the header to the entry point. |
1223 NoSafepointScope no_safepoint; | 1218 NoSafepointScope no_safepoint; |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 index -= max_vm_isolate_object_id_; | 1492 index -= max_vm_isolate_object_id_; |
1498 ASSERT(index < backward_references_->length()); | 1493 ASSERT(index < backward_references_->length()); |
1499 BackRefNode& ref = (*backward_references_)[index]; | 1494 BackRefNode& ref = (*backward_references_)[index]; |
1500 ref.AddPatchRecord(patch_object_id, patch_offset); | 1495 ref.AddPatchRecord(patch_object_id, patch_offset); |
1501 } | 1496 } |
1502 } | 1497 } |
1503 | 1498 |
1504 | 1499 |
1505 void SnapshotReader::ProcessDeferredCanonicalizations() { | 1500 void SnapshotReader::ProcessDeferredCanonicalizations() { |
1506 Type& typeobj = Type::Handle(); | 1501 Type& typeobj = Type::Handle(); |
1507 FunctionType& funtypeobj = FunctionType::Handle(); | |
1508 TypeArguments& typeargs = TypeArguments::Handle(); | 1502 TypeArguments& typeargs = TypeArguments::Handle(); |
1509 Object& newobj = Object::Handle(); | 1503 Object& newobj = Object::Handle(); |
1510 for (intptr_t i = 0; i < backward_references_->length(); i++) { | 1504 for (intptr_t i = 0; i < backward_references_->length(); i++) { |
1511 BackRefNode& backref = (*backward_references_)[i]; | 1505 BackRefNode& backref = (*backward_references_)[i]; |
1512 if (backref.defer_canonicalization()) { | 1506 if (backref.defer_canonicalization()) { |
1513 Object* objref = backref.reference(); | 1507 Object* objref = backref.reference(); |
1514 // Object should either be a type, a function type, or a type argument. | 1508 // Object should either be a type or a type argument. |
1515 if (objref->IsType()) { | 1509 if (objref->IsType()) { |
1516 typeobj ^= objref->raw(); | 1510 typeobj ^= objref->raw(); |
1517 newobj = typeobj.Canonicalize(); | 1511 newobj = typeobj.Canonicalize(); |
1518 } else if (objref->IsFunctionType()) { | |
1519 funtypeobj ^= objref->raw(); | |
1520 newobj = funtypeobj.Canonicalize(); | |
1521 } else { | 1512 } else { |
1522 ASSERT(objref->IsTypeArguments()); | 1513 ASSERT(objref->IsTypeArguments()); |
1523 typeargs ^= objref->raw(); | 1514 typeargs ^= objref->raw(); |
1524 newobj = typeargs.Canonicalize(); | 1515 newobj = typeargs.Canonicalize(); |
1525 } | 1516 } |
1526 if (newobj.raw() != objref->raw()) { | 1517 if (newobj.raw() != objref->raw()) { |
1527 ZoneGrowableArray<intptr_t>* patches = backref.patch_records(); | 1518 ZoneGrowableArray<intptr_t>* patches = backref.patch_records(); |
1528 ASSERT(newobj.IsCanonical()); | 1519 ASSERT(newobj.IsCanonical()); |
1529 ASSERT(patches != NULL); | 1520 ASSERT(patches != NULL); |
1530 // First we replace the back ref table with the canonical object. | 1521 // First we replace the back ref table with the canonical object. |
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2696 if (setjmp(*jump.Set()) == 0) { | 2687 if (setjmp(*jump.Set()) == 0) { |
2697 NoSafepointScope no_safepoint; | 2688 NoSafepointScope no_safepoint; |
2698 WriteObject(obj.raw()); | 2689 WriteObject(obj.raw()); |
2699 } else { | 2690 } else { |
2700 ThrowException(exception_type(), exception_msg()); | 2691 ThrowException(exception_type(), exception_msg()); |
2701 } | 2692 } |
2702 } | 2693 } |
2703 | 2694 |
2704 | 2695 |
2705 } // namespace dart | 2696 } // namespace dart |
OLD | NEW |