| 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 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 } | 1135 } |
| 1136 return Mint::NewCanonical(value); | 1136 return Mint::NewCanonical(value); |
| 1137 } | 1137 } |
| 1138 | 1138 |
| 1139 | 1139 |
| 1140 RawStacktrace* SnapshotReader::NewStacktrace() { | 1140 RawStacktrace* SnapshotReader::NewStacktrace() { |
| 1141 ALLOC_NEW_OBJECT(Stacktrace); | 1141 ALLOC_NEW_OBJECT(Stacktrace); |
| 1142 } | 1142 } |
| 1143 | 1143 |
| 1144 | 1144 |
| 1145 int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions) { | 1145 int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions, |
| 1146 intptr_t heap_size = instructions->Size(); | 1146 RawCode* code) { |
| 1147 #if defined(PRODUCT) |
| 1148 // Instructions are only dedup in product mode because it obfuscates profiler |
| 1149 // results. |
| 1150 for (intptr_t i = 0; i < instructions_.length(); i++) { |
| 1151 if (instructions_[i].raw_insns_ == instructions) { |
| 1152 return instructions_[i].offset_; |
| 1153 } |
| 1154 } |
| 1155 #endif |
| 1156 |
| 1157 intptr_t payload_size = instructions->ptr()->size_; |
| 1158 payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment()); |
| 1159 |
| 1147 intptr_t offset = next_offset_; | 1160 intptr_t offset = next_offset_; |
| 1148 next_offset_ += heap_size; | 1161 ASSERT(Utils::IsAligned(next_offset_, OS::PreferredCodeAlignment())); |
| 1149 instructions_.Add(InstructionsData(instructions)); | 1162 next_offset_ += payload_size; |
| 1163 ASSERT(Utils::IsAligned(next_offset_, OS::PreferredCodeAlignment())); |
| 1164 instructions_.Add(InstructionsData(instructions, code, offset)); |
| 1165 |
| 1150 return offset; | 1166 return offset; |
| 1151 } | 1167 } |
| 1152 | 1168 |
| 1153 | 1169 |
| 1154 int32_t InstructionsWriter::GetObjectOffsetFor(RawObject* raw_object) { | 1170 int32_t InstructionsWriter::GetObjectOffsetFor(RawObject* raw_object) { |
| 1155 intptr_t heap_size = raw_object->Size(); | 1171 intptr_t heap_size = raw_object->Size(); |
| 1156 intptr_t offset = next_object_offset_; | 1172 intptr_t offset = next_object_offset_; |
| 1157 next_object_offset_ += heap_size; | 1173 next_object_offset_ += heap_size; |
| 1158 objects_.Add(ObjectData(raw_object)); | 1174 objects_.Add(ObjectData(raw_object)); |
| 1159 return offset; | 1175 return offset; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1206 | 1222 |
| 1207 Object& owner = Object::Handle(zone); | 1223 Object& owner = Object::Handle(zone); |
| 1208 String& str = String::Handle(zone); | 1224 String& str = String::Handle(zone); |
| 1209 | 1225 |
| 1210 for (intptr_t i = 0; i < instructions_.length(); i++) { | 1226 for (intptr_t i = 0; i < instructions_.length(); i++) { |
| 1211 const Instructions& insns = *instructions_[i].insns_; | 1227 const Instructions& insns = *instructions_[i].insns_; |
| 1212 const Code& code = *instructions_[i].code_; | 1228 const Code& code = *instructions_[i].code_; |
| 1213 | 1229 |
| 1214 ASSERT(insns.raw()->Size() % sizeof(uint64_t) == 0); | 1230 ASSERT(insns.raw()->Size() % sizeof(uint64_t) == 0); |
| 1215 | 1231 |
| 1216 { | 1232 // 1. Write a label at the entry point. |
| 1217 // 1. Write from the header to the entry point. | |
| 1218 NoSafepointScope no_safepoint; | |
| 1219 | |
| 1220 uword beginning = reinterpret_cast<uword>(insns.raw_ptr()); | |
| 1221 uword entry = beginning + Instructions::HeaderSize(); | |
| 1222 | |
| 1223 ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t))); | |
| 1224 ASSERT(Utils::IsAligned(entry, sizeof(uint64_t))); | |
| 1225 | |
| 1226 // Write Instructions with the mark and VM heap bits set. | |
| 1227 uword marked_tags = insns.raw_ptr()->tags_; | |
| 1228 marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags); | |
| 1229 marked_tags = RawObject::MarkBit::update(true, marked_tags); | |
| 1230 | |
| 1231 WriteWordLiteral(marked_tags); | |
| 1232 beginning += sizeof(uword); | |
| 1233 | |
| 1234 for (uword* cursor = reinterpret_cast<uword*>(beginning); | |
| 1235 cursor < reinterpret_cast<uword*>(entry); | |
| 1236 cursor++) { | |
| 1237 WriteWordLiteral(*cursor); | |
| 1238 } | |
| 1239 } | |
| 1240 | |
| 1241 // 2. Write a label at the entry point. | |
| 1242 owner = code.owner(); | 1233 owner = code.owner(); |
| 1243 if (owner.IsNull()) { | 1234 if (owner.IsNull()) { |
| 1244 const char* name = StubCode::NameOfStub(insns.EntryPoint()); | 1235 const char* name = StubCode::NameOfStub(insns.EntryPoint()); |
| 1245 stream_.Print("Precompiled_Stub_%s:\n", name); | 1236 stream_.Print("Precompiled_Stub_%s:\n", name); |
| 1246 } else if (owner.IsClass()) { | 1237 } else if (owner.IsClass()) { |
| 1247 str = Class::Cast(owner).Name(); | 1238 str = Class::Cast(owner).Name(); |
| 1248 const char* name = str.ToCString(); | 1239 const char* name = str.ToCString(); |
| 1249 EnsureIdentifier(const_cast<char*>(name)); | 1240 EnsureIdentifier(const_cast<char*>(name)); |
| 1250 stream_.Print("Precompiled_AllocationStub_%s_%" Pd ":\n", name, i); | 1241 stream_.Print("Precompiled_AllocationStub_%s_%" Pd ":\n", name, i); |
| 1251 } else if (owner.IsFunction()) { | 1242 } else if (owner.IsFunction()) { |
| 1252 const char* name = Function::Cast(owner).ToQualifiedCString(); | 1243 const char* name = Function::Cast(owner).ToQualifiedCString(); |
| 1253 EnsureIdentifier(const_cast<char*>(name)); | 1244 EnsureIdentifier(const_cast<char*>(name)); |
| 1254 stream_.Print("Precompiled_%s_%" Pd ":\n", name, i); | 1245 stream_.Print("Precompiled_%s_%" Pd ":\n", name, i); |
| 1255 } else { | 1246 } else { |
| 1256 UNREACHABLE(); | 1247 UNREACHABLE(); |
| 1257 } | 1248 } |
| 1258 | 1249 |
| 1259 { | 1250 { |
| 1260 // 3. Write from the entry point to the end. | 1251 // 2. Write from the entry point to the end. |
| 1261 NoSafepointScope no_safepoint; | 1252 NoSafepointScope no_safepoint; |
| 1262 uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag; | 1253 uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag; |
| 1263 uword entry = beginning + Instructions::HeaderSize(); | 1254 uword entry = beginning + Instructions::HeaderSize(); |
| 1264 uword end = beginning + insns.raw()->Size(); | 1255 uword payload_size = insns.size(); |
| 1256 payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment()); |
| 1257 uword end = entry + payload_size; |
| 1265 | 1258 |
| 1266 ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t))); | 1259 ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t))); |
| 1267 ASSERT(Utils::IsAligned(entry, sizeof(uint64_t))); | 1260 ASSERT(Utils::IsAligned(entry, sizeof(uint64_t))); |
| 1268 ASSERT(Utils::IsAligned(end, sizeof(uint64_t))); | 1261 ASSERT(Utils::IsAligned(end, sizeof(uint64_t))); |
| 1269 | 1262 |
| 1270 for (uword* cursor = reinterpret_cast<uword*>(entry); | 1263 for (uword* cursor = reinterpret_cast<uword*>(entry); |
| 1271 cursor < reinterpret_cast<uword*>(end); | 1264 cursor < reinterpret_cast<uword*>(end); |
| 1272 cursor++) { | 1265 cursor++) { |
| 1273 WriteWordLiteral(*cursor); | 1266 WriteWordLiteral(*cursor); |
| 1274 } | 1267 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1306 start += sizeof(uword); | 1299 start += sizeof(uword); |
| 1307 for (uword* cursor = reinterpret_cast<uword*>(start); | 1300 for (uword* cursor = reinterpret_cast<uword*>(start); |
| 1308 cursor < reinterpret_cast<uword*>(end); | 1301 cursor < reinterpret_cast<uword*>(end); |
| 1309 cursor++) { | 1302 cursor++) { |
| 1310 WriteWordLiteral(*cursor); | 1303 WriteWordLiteral(*cursor); |
| 1311 } | 1304 } |
| 1312 } | 1305 } |
| 1313 } | 1306 } |
| 1314 | 1307 |
| 1315 | 1308 |
| 1316 RawInstructions* InstructionsReader::GetInstructionsAt(int32_t offset, | 1309 uword InstructionsReader::GetInstructionsAt(int32_t offset) { |
| 1317 uword expected_tags) { | |
| 1318 ASSERT(Utils::IsAligned(offset, OS::PreferredCodeAlignment())); | 1310 ASSERT(Utils::IsAligned(offset, OS::PreferredCodeAlignment())); |
| 1319 | 1311 return reinterpret_cast<uword>(instructions_buffer_) + offset; |
| 1320 RawInstructions* result = | |
| 1321 reinterpret_cast<RawInstructions*>( | |
| 1322 reinterpret_cast<uword>(instructions_buffer_) + | |
| 1323 offset + kHeapObjectTag); | |
| 1324 | |
| 1325 #ifdef DEBUG | |
| 1326 uword actual_tags = result->ptr()->tags_; | |
| 1327 if (actual_tags != expected_tags) { | |
| 1328 FATAL2("Instructions tag mismatch: expected %" Pd ", saw %" Pd, | |
| 1329 expected_tags, | |
| 1330 actual_tags); | |
| 1331 } | |
| 1332 #endif | |
| 1333 | |
| 1334 ASSERT(result->IsMarked()); | |
| 1335 | |
| 1336 return result; | |
| 1337 } | 1312 } |
| 1338 | 1313 |
| 1339 | 1314 |
| 1340 RawObject* InstructionsReader::GetObjectAt(int32_t offset) { | 1315 RawObject* InstructionsReader::GetObjectAt(int32_t offset) { |
| 1341 ASSERT(Utils::IsAligned(offset, kWordSize)); | 1316 ASSERT(Utils::IsAligned(offset, kWordSize)); |
| 1342 | 1317 |
| 1343 RawObject* result = | 1318 RawObject* result = |
| 1344 reinterpret_cast<RawObject*>( | 1319 reinterpret_cast<RawObject*>( |
| 1345 reinterpret_cast<uword>(data_buffer_) + offset + kHeapObjectTag); | 1320 reinterpret_cast<uword>(data_buffer_) + offset + kHeapObjectTag); |
| 1346 ASSERT(result->IsMarked()); | 1321 ASSERT(result->IsMarked()); |
| (...skipping 1340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2687 if (setjmp(*jump.Set()) == 0) { | 2662 if (setjmp(*jump.Set()) == 0) { |
| 2688 NoSafepointScope no_safepoint; | 2663 NoSafepointScope no_safepoint; |
| 2689 WriteObject(obj.raw()); | 2664 WriteObject(obj.raw()); |
| 2690 } else { | 2665 } else { |
| 2691 ThrowException(exception_type(), exception_msg()); | 2666 ThrowException(exception_type(), exception_msg()); |
| 2692 } | 2667 } |
| 2693 } | 2668 } |
| 2694 | 2669 |
| 2695 | 2670 |
| 2696 } // namespace dart | 2671 } // namespace dart |
| OLD | NEW |