OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/snapshot/code-serializer.h" | 5 #include "src/snapshot/code-serializer.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/log.h" | 10 #include "src/log.h" |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 if (result->script()->IsScript()) { | 222 if (result->script()->IsScript()) { |
223 Script* script = Script::cast(result->script()); | 223 Script* script = Script::cast(result->script()); |
224 if (script->name()->IsString()) name = String::cast(script->name()); | 224 if (script->name()->IsString()) name = String::cast(script->name()); |
225 } | 225 } |
226 PROFILE(isolate, CodeCreateEvent(CodeEventListener::SCRIPT_TAG, | 226 PROFILE(isolate, CodeCreateEvent(CodeEventListener::SCRIPT_TAG, |
227 result->abstract_code(), *result, name)); | 227 result->abstract_code(), *result, name)); |
228 } | 228 } |
229 return scope.CloseAndEscape(result); | 229 return scope.CloseAndEscape(result); |
230 } | 230 } |
231 | 231 |
| 232 WasmCompiledModuleSerializer::WasmCompiledModuleSerializer( |
| 233 Isolate* isolate, uint32_t source_hash, Handle<Context> native_context, |
| 234 Handle<SeqOneByteString> module_bytes) |
| 235 : CodeSerializer(isolate, source_hash) { |
| 236 reference_map()->AddAttachedReference(*isolate->native_context()); |
| 237 reference_map()->AddAttachedReference(*module_bytes); |
| 238 } |
| 239 |
232 std::unique_ptr<ScriptData> WasmCompiledModuleSerializer::SerializeWasmModule( | 240 std::unique_ptr<ScriptData> WasmCompiledModuleSerializer::SerializeWasmModule( |
233 Isolate* isolate, Handle<FixedArray> input) { | 241 Isolate* isolate, Handle<FixedArray> input) { |
234 Handle<WasmCompiledModule> compiled_module = | 242 Handle<WasmCompiledModule> compiled_module = |
235 Handle<WasmCompiledModule>::cast(input); | 243 Handle<WasmCompiledModule>::cast(input); |
236 WasmCompiledModuleSerializer wasm_cs(isolate, 0); | 244 WasmCompiledModuleSerializer wasm_cs(isolate, 0, isolate->native_context(), |
237 wasm_cs.reference_map()->AddAttachedReference(*isolate->native_context()); | 245 handle(compiled_module->module_bytes())); |
238 wasm_cs.reference_map()->AddAttachedReference( | |
239 compiled_module->module_bytes()); | |
240 ScriptData* data = wasm_cs.Serialize(compiled_module); | 246 ScriptData* data = wasm_cs.Serialize(compiled_module); |
241 return std::unique_ptr<ScriptData>(data); | 247 return std::unique_ptr<ScriptData>(data); |
242 } | 248 } |
243 | 249 |
244 MaybeHandle<FixedArray> WasmCompiledModuleSerializer::DeserializeWasmModule( | 250 MaybeHandle<FixedArray> WasmCompiledModuleSerializer::DeserializeWasmModule( |
245 Isolate* isolate, ScriptData* data, Vector<const byte> wire_bytes) { | 251 Isolate* isolate, ScriptData* data, Vector<const byte> wire_bytes) { |
246 SerializedCodeData::SanityCheckResult sanity_check_result = | 252 SerializedCodeData::SanityCheckResult sanity_check_result = |
247 SerializedCodeData::CHECK_SUCCESS; | 253 SerializedCodeData::CHECK_SUCCESS; |
248 MaybeHandle<FixedArray> nothing; | 254 MaybeHandle<FixedArray> nothing; |
249 const SerializedCodeData scd = SerializedCodeData::FromCachedData( | 255 const SerializedCodeData scd = SerializedCodeData::FromCachedData( |
(...skipping 20 matching lines...) Expand all Loading... |
270 deserializer.AddAttachedObject( | 276 deserializer.AddAttachedObject( |
271 CodeStub::GetCode(isolate, stub_keys[i]).ToHandleChecked()); | 277 CodeStub::GetCode(isolate, stub_keys[i]).ToHandleChecked()); |
272 } | 278 } |
273 | 279 |
274 MaybeHandle<HeapObject> obj = deserializer.DeserializeObject(isolate); | 280 MaybeHandle<HeapObject> obj = deserializer.DeserializeObject(isolate); |
275 if (obj.is_null() || !obj.ToHandleChecked()->IsFixedArray()) return nothing; | 281 if (obj.is_null() || !obj.ToHandleChecked()->IsFixedArray()) return nothing; |
276 // Cast without type checks, as the module wrapper is not there yet. | 282 // Cast without type checks, as the module wrapper is not there yet. |
277 Handle<WasmCompiledModule> compiled_module( | 283 Handle<WasmCompiledModule> compiled_module( |
278 static_cast<WasmCompiledModule*>(*obj.ToHandleChecked()), isolate); | 284 static_cast<WasmCompiledModule*>(*obj.ToHandleChecked()), isolate); |
279 | 285 |
280 WasmCompiledModule::RecreateModuleWrapper(isolate, compiled_module); | 286 WasmCompiledModule::ReinitializeAfterDeserialization(isolate, |
| 287 compiled_module); |
281 DCHECK(WasmCompiledModule::IsWasmCompiledModule(*compiled_module)); | 288 DCHECK(WasmCompiledModule::IsWasmCompiledModule(*compiled_module)); |
282 return compiled_module; | 289 return compiled_module; |
283 } | 290 } |
284 | 291 |
| 292 void WasmCompiledModuleSerializer::SerializeCodeObject( |
| 293 Code* code_object, HowToCode how_to_code, WhereToPoint where_to_point) { |
| 294 Code::Kind kind = code_object->kind(); |
| 295 switch (kind) { |
| 296 case Code::WASM_FUNCTION: |
| 297 case Code::JS_TO_WASM_FUNCTION: |
| 298 // Just serialize the code_object. |
| 299 break; |
| 300 case Code::WASM_TO_JS_FUNCTION: |
| 301 // Serialize the illegal builtin instead. On instantiation of a |
| 302 // deserialized module, these will be replaced again. |
| 303 code_object = *isolate()->builtins()->Illegal(); |
| 304 break; |
| 305 default: |
| 306 UNREACHABLE(); |
| 307 } |
| 308 SerializeGeneric(code_object, how_to_code, where_to_point); |
| 309 } |
| 310 |
| 311 bool WasmCompiledModuleSerializer::ElideObject(Object* obj) { |
| 312 return obj->IsWeakCell() || obj->IsForeign() || obj->IsBreakPointInfo(); |
| 313 } |
| 314 |
285 class Checksum { | 315 class Checksum { |
286 public: | 316 public: |
287 explicit Checksum(Vector<const byte> payload) { | 317 explicit Checksum(Vector<const byte> payload) { |
288 #ifdef MEMORY_SANITIZER | 318 #ifdef MEMORY_SANITIZER |
289 // Computing the checksum includes padding bytes for objects like strings. | 319 // Computing the checksum includes padding bytes for objects like strings. |
290 // Mark every object as initialized in the code serializer. | 320 // Mark every object as initialized in the code serializer. |
291 MSAN_MEMORY_IS_INITIALIZED(payload.start(), payload.length()); | 321 MSAN_MEMORY_IS_INITIALIZED(payload.start(), payload.length()); |
292 #endif // MEMORY_SANITIZER | 322 #endif // MEMORY_SANITIZER |
293 // Fletcher's checksum. Modified to reduce 64-bit sums to 32-bit. | 323 // Fletcher's checksum. Modified to reduce 64-bit sums to 32-bit. |
294 uintptr_t a = 1; | 324 uintptr_t a = 1; |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 *rejection_result = scd.SanityCheck(isolate, expected_source_hash); | 472 *rejection_result = scd.SanityCheck(isolate, expected_source_hash); |
443 if (*rejection_result != CHECK_SUCCESS) { | 473 if (*rejection_result != CHECK_SUCCESS) { |
444 cached_data->Reject(); | 474 cached_data->Reject(); |
445 return SerializedCodeData(nullptr, 0); | 475 return SerializedCodeData(nullptr, 0); |
446 } | 476 } |
447 return scd; | 477 return scd; |
448 } | 478 } |
449 | 479 |
450 } // namespace internal | 480 } // namespace internal |
451 } // namespace v8 | 481 } // namespace v8 |
OLD | NEW |