| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "src/assembler-inl.h" | 7 #include "src/assembler-inl.h" |
| 8 #include "src/base/adapters.h" | 8 #include "src/base/adapters.h" |
| 9 #include "src/base/atomic-utils.h" | 9 #include "src/base/atomic-utils.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 | 112 |
| 113 is_external = true; | 113 is_external = true; |
| 114 return memory; | 114 return memory; |
| 115 } else { | 115 } else { |
| 116 void* memory = isolate->array_buffer_allocator()->Allocate(size); | 116 void* memory = isolate->array_buffer_allocator()->Allocate(size); |
| 117 return memory; | 117 return memory; |
| 118 } | 118 } |
| 119 } | 119 } |
| 120 | 120 |
| 121 void RelocateMemoryReferencesInCode(Handle<FixedArray> code_table, | 121 void RelocateMemoryReferencesInCode(Handle<FixedArray> code_table, |
| 122 uint32_t num_imported_functions, |
| 122 Address old_start, Address start, | 123 Address old_start, Address start, |
| 123 uint32_t prev_size, uint32_t new_size) { | 124 uint32_t prev_size, uint32_t new_size) { |
| 124 for (int i = 0; i < code_table->length(); ++i) { | 125 for (int i = static_cast<int>(num_imported_functions); |
| 126 i < code_table->length(); ++i) { |
| 125 DCHECK(code_table->get(i)->IsCode()); | 127 DCHECK(code_table->get(i)->IsCode()); |
| 126 Handle<Code> code = Handle<Code>(Code::cast(code_table->get(i))); | 128 Handle<Code> code = Handle<Code>(Code::cast(code_table->get(i))); |
| 127 AllowDeferredHandleDereference embedding_raw_address; | 129 AllowDeferredHandleDereference embedding_raw_address; |
| 128 int mask = (1 << RelocInfo::WASM_MEMORY_REFERENCE) | | 130 int mask = (1 << RelocInfo::WASM_MEMORY_REFERENCE) | |
| 129 (1 << RelocInfo::WASM_MEMORY_SIZE_REFERENCE); | 131 (1 << RelocInfo::WASM_MEMORY_SIZE_REFERENCE); |
| 130 for (RelocIterator it(*code, mask); !it.done(); it.next()) { | 132 for (RelocIterator it(*code, mask); !it.done(); it.next()) { |
| 131 it.rinfo()->update_wasm_memory_reference(old_start, start, prev_size, | 133 it.rinfo()->update_wasm_memory_reference(old_start, start, prev_size, |
| 132 new_size); | 134 new_size); |
| 133 } | 135 } |
| 134 } | 136 } |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_SIZE_REFERENCE) | | 559 RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_SIZE_REFERENCE) | |
| 558 RelocInfo::ModeMask(RelocInfo::WASM_GLOBAL_REFERENCE) | | 560 RelocInfo::ModeMask(RelocInfo::WASM_GLOBAL_REFERENCE) | |
| 559 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 561 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
| 560 | 562 |
| 561 // Patch code to update memory references, global references, and function | 563 // Patch code to update memory references, global references, and function |
| 562 // table references. | 564 // table references. |
| 563 Object* fct_obj = compiled_module->ptr_to_code_table(); | 565 Object* fct_obj = compiled_module->ptr_to_code_table(); |
| 564 if (fct_obj != nullptr && fct_obj != undefined && | 566 if (fct_obj != nullptr && fct_obj != undefined && |
| 565 (old_mem_size > 0 || globals_start != nullptr || function_tables)) { | 567 (old_mem_size > 0 || globals_start != nullptr || function_tables)) { |
| 566 FixedArray* functions = FixedArray::cast(fct_obj); | 568 FixedArray* functions = FixedArray::cast(fct_obj); |
| 567 for (int i = 0; i < functions->length(); ++i) { | 569 for (int i = compiled_module->num_imported_functions(); |
| 570 i < functions->length(); ++i) { |
| 568 Code* code = Code::cast(functions->get(i)); | 571 Code* code = Code::cast(functions->get(i)); |
| 569 bool changed = false; | 572 bool changed = false; |
| 570 for (RelocIterator it(code, mode_mask); !it.done(); it.next()) { | 573 for (RelocIterator it(code, mode_mask); !it.done(); it.next()) { |
| 571 RelocInfo::Mode mode = it.rinfo()->rmode(); | 574 RelocInfo::Mode mode = it.rinfo()->rmode(); |
| 572 if (RelocInfo::IsWasmMemoryReference(mode) || | 575 if (RelocInfo::IsWasmMemoryReference(mode) || |
| 573 RelocInfo::IsWasmMemorySizeReference(mode)) { | 576 RelocInfo::IsWasmMemorySizeReference(mode)) { |
| 574 it.rinfo()->update_wasm_memory_reference( | 577 it.rinfo()->update_wasm_memory_reference( |
| 575 old_mem_address, nullptr, old_mem_size, default_mem_size); | 578 old_mem_address, nullptr, old_mem_size, default_mem_size); |
| 576 changed = true; | 579 changed = true; |
| 577 } else if (RelocInfo::IsWasmGlobalReference(mode)) { | 580 } else if (RelocInfo::IsWasmGlobalReference(mode)) { |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 983 | 986 |
| 984 Handle<WasmSharedModuleData> shared = WasmSharedModuleData::New( | 987 Handle<WasmSharedModuleData> shared = WasmSharedModuleData::New( |
| 985 isolate, module_wrapper, Handle<SeqOneByteString>::cast(module_bytes), | 988 isolate, module_wrapper, Handle<SeqOneByteString>::cast(module_bytes), |
| 986 script, asm_js_offset_table); | 989 script, asm_js_offset_table); |
| 987 | 990 |
| 988 // Create the compiled module object, and populate with compiled functions | 991 // Create the compiled module object, and populate with compiled functions |
| 989 // and information needed at instantiation time. This object needs to be | 992 // and information needed at instantiation time. This object needs to be |
| 990 // serializable. Instantiation may occur off a deserialized version of this | 993 // serializable. Instantiation may occur off a deserialized version of this |
| 991 // object. | 994 // object. |
| 992 Handle<WasmCompiledModule> ret = WasmCompiledModule::New(isolate, shared); | 995 Handle<WasmCompiledModule> ret = WasmCompiledModule::New(isolate, shared); |
| 996 ret->set_num_imported_functions(num_imported_functions); |
| 993 ret->set_code_table(code_table); | 997 ret->set_code_table(code_table); |
| 994 ret->set_min_mem_pages(min_mem_pages); | 998 ret->set_min_mem_pages(min_mem_pages); |
| 995 ret->set_max_mem_pages(max_mem_pages); | 999 ret->set_max_mem_pages(max_mem_pages); |
| 996 if (function_table_count > 0) { | 1000 if (function_table_count > 0) { |
| 997 ret->set_function_tables(function_tables); | 1001 ret->set_function_tables(function_tables); |
| 998 ret->set_signature_tables(signature_tables); | 1002 ret->set_signature_tables(signature_tables); |
| 999 ret->set_empty_function_tables(function_tables); | 1003 ret->set_empty_function_tables(function_tables); |
| 1000 } | 1004 } |
| 1001 | 1005 |
| 1002 // If we created a wasm script, finish it now and make it public to the | 1006 // If we created a wasm script, finish it now and make it public to the |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1336 uint32_t mem_size = | 1340 uint32_t mem_size = |
| 1337 static_cast<uint32_t>(memory_->byte_length()->Number()); | 1341 static_cast<uint32_t>(memory_->byte_length()->Number()); |
| 1338 LoadDataSegments(mem_start, mem_size); | 1342 LoadDataSegments(mem_start, mem_size); |
| 1339 | 1343 |
| 1340 uint32_t old_mem_size = compiled_module_->mem_size(); | 1344 uint32_t old_mem_size = compiled_module_->mem_size(); |
| 1341 Address old_mem_start = | 1345 Address old_mem_start = |
| 1342 compiled_module_->has_memory() | 1346 compiled_module_->has_memory() |
| 1343 ? static_cast<Address>( | 1347 ? static_cast<Address>( |
| 1344 compiled_module_->memory()->backing_store()) | 1348 compiled_module_->memory()->backing_store()) |
| 1345 : nullptr; | 1349 : nullptr; |
| 1346 RelocateMemoryReferencesInCode(code_table, old_mem_start, mem_start, | 1350 RelocateMemoryReferencesInCode( |
| 1347 old_mem_size, mem_size); | 1351 code_table, module_->num_imported_functions, old_mem_start, mem_start, |
| 1352 old_mem_size, mem_size); |
| 1348 compiled_module_->set_memory(memory_); | 1353 compiled_module_->set_memory(memory_); |
| 1349 } | 1354 } |
| 1350 | 1355 |
| 1351 //-------------------------------------------------------------------------- | 1356 //-------------------------------------------------------------------------- |
| 1352 // Set up the runtime support for the new instance. | 1357 // Set up the runtime support for the new instance. |
| 1353 //-------------------------------------------------------------------------- | 1358 //-------------------------------------------------------------------------- |
| 1354 Handle<WeakCell> weak_link = factory->NewWeakCell(instance); | 1359 Handle<WeakCell> weak_link = factory->NewWeakCell(instance); |
| 1355 | 1360 |
| 1356 for (int i = num_imported_functions + FLAG_skip_compiling_wasm_funcs; | 1361 for (int i = num_imported_functions + FLAG_skip_compiling_wasm_funcs; |
| 1357 i < code_table->length(); ++i) { | 1362 i < code_table->length(); ++i) { |
| (...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2373 void UncheckedUpdateInstanceMemory(Isolate* isolate, | 2378 void UncheckedUpdateInstanceMemory(Isolate* isolate, |
| 2374 Handle<WasmInstanceObject> instance, | 2379 Handle<WasmInstanceObject> instance, |
| 2375 Address old_mem_start, uint32_t old_size) { | 2380 Address old_mem_start, uint32_t old_size) { |
| 2376 DCHECK(instance->has_memory_buffer()); | 2381 DCHECK(instance->has_memory_buffer()); |
| 2377 Handle<JSArrayBuffer> new_buffer(instance->memory_buffer()); | 2382 Handle<JSArrayBuffer> new_buffer(instance->memory_buffer()); |
| 2378 uint32_t new_size = new_buffer->byte_length()->Number(); | 2383 uint32_t new_size = new_buffer->byte_length()->Number(); |
| 2379 DCHECK(new_size <= std::numeric_limits<uint32_t>::max()); | 2384 DCHECK(new_size <= std::numeric_limits<uint32_t>::max()); |
| 2380 Address new_mem_start = static_cast<Address>(new_buffer->backing_store()); | 2385 Address new_mem_start = static_cast<Address>(new_buffer->backing_store()); |
| 2381 DCHECK_NOT_NULL(new_mem_start); | 2386 DCHECK_NOT_NULL(new_mem_start); |
| 2382 Handle<FixedArray> code_table = instance->compiled_module()->code_table(); | 2387 Handle<FixedArray> code_table = instance->compiled_module()->code_table(); |
| 2383 RelocateMemoryReferencesInCode(code_table, old_mem_start, new_mem_start, | 2388 RelocateMemoryReferencesInCode( |
| 2384 old_size, new_size); | 2389 code_table, instance->compiled_module()->module()->num_imported_functions, |
| 2390 old_mem_start, new_mem_start, old_size, new_size); |
| 2385 } | 2391 } |
| 2386 | 2392 |
| 2387 int32_t wasm::GrowWebAssemblyMemory(Isolate* isolate, | 2393 int32_t wasm::GrowWebAssemblyMemory(Isolate* isolate, |
| 2388 Handle<WasmMemoryObject> receiver, | 2394 Handle<WasmMemoryObject> receiver, |
| 2389 uint32_t pages) { | 2395 uint32_t pages) { |
| 2390 DCHECK(WasmJs::IsWasmMemoryObject(isolate, receiver)); | 2396 DCHECK(WasmJs::IsWasmMemoryObject(isolate, receiver)); |
| 2391 Handle<WasmMemoryObject> memory_object = | 2397 Handle<WasmMemoryObject> memory_object = |
| 2392 handle(WasmMemoryObject::cast(*receiver)); | 2398 handle(WasmMemoryObject::cast(*receiver)); |
| 2393 MaybeHandle<JSArrayBuffer> memory_buffer = handle(memory_object->buffer()); | 2399 MaybeHandle<JSArrayBuffer> memory_buffer = handle(memory_object->buffer()); |
| 2394 Handle<JSArrayBuffer> old_buffer; | 2400 Handle<JSArrayBuffer> old_buffer; |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2684 | 2690 |
| 2685 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), | 2691 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), |
| 2686 NONE); | 2692 NONE); |
| 2687 JSObject::AddProperty(entry, kind_string, export_kind, NONE); | 2693 JSObject::AddProperty(entry, kind_string, export_kind, NONE); |
| 2688 | 2694 |
| 2689 storage->set(index, *entry); | 2695 storage->set(index, *entry); |
| 2690 } | 2696 } |
| 2691 | 2697 |
| 2692 return array_object; | 2698 return array_object; |
| 2693 } | 2699 } |
| OLD | NEW |