| 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/base/atomic-utils.h" | 7 #include "src/base/atomic-utils.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 | 9 |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 DCHECK_EQ(0, bytes[i]); | 178 DCHECK_EQ(0, bytes[i]); |
| 179 } | 179 } |
| 180 #endif | 180 #endif |
| 181 | 181 |
| 182 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); | 182 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
| 183 JSArrayBuffer::Setup(buffer, isolate, false, memory, static_cast<int>(size)); | 183 JSArrayBuffer::Setup(buffer, isolate, false, memory, static_cast<int>(size)); |
| 184 buffer->set_is_neuterable(false); | 184 buffer->set_is_neuterable(false); |
| 185 return buffer; | 185 return buffer; |
| 186 } | 186 } |
| 187 | 187 |
| 188 int UpdateReferencesMask(bool update_globals) { |
| 189 if (update_globals) { |
| 190 return (1 << RelocInfo::WASM_MEMORY_REFERENCE) | |
| 191 (1 << RelocInfo::WASM_MEMORY_BYTE_SIZE_REFERENCE) | |
| 192 (1 << RelocInfo::WASM_MEMORY_WORD_SIZE_REFERENCE) | |
| 193 (1 << RelocInfo::WASM_MEMORY_DWORD_SIZE_REFERENCE) | |
| 194 (1 << RelocInfo::WASM_MEMORY_QWORD_SIZE_REFERENCE) | |
| 195 (1 << RelocInfo::WASM_GLOBAL_REFERENCE); |
| 196 } else { |
| 197 return (1 << RelocInfo::WASM_MEMORY_REFERENCE) | |
| 198 (1 << RelocInfo::WASM_MEMORY_BYTE_SIZE_REFERENCE) | |
| 199 (1 << RelocInfo::WASM_MEMORY_WORD_SIZE_REFERENCE) | |
| 200 (1 << RelocInfo::WASM_MEMORY_DWORD_SIZE_REFERENCE) | |
| 201 (1 << RelocInfo::WASM_MEMORY_QWORD_SIZE_REFERENCE); |
| 202 } |
| 203 } |
| 204 |
| 188 void RelocateInstanceCode(Handle<JSObject> instance, Address old_start, | 205 void RelocateInstanceCode(Handle<JSObject> instance, Address old_start, |
| 189 Address start, uint32_t prev_size, | 206 Address start, uint32_t prev_size, |
| 190 uint32_t new_size) { | 207 uint32_t new_size) { |
| 191 Handle<FixedArray> functions = Handle<FixedArray>( | 208 Handle<FixedArray> functions = Handle<FixedArray>( |
| 192 FixedArray::cast(instance->GetInternalField(kWasmModuleCodeTable))); | 209 FixedArray::cast(instance->GetInternalField(kWasmModuleCodeTable))); |
| 193 for (int i = 0; i < functions->length(); ++i) { | 210 for (int i = 0; i < functions->length(); ++i) { |
| 194 Handle<Code> function = Handle<Code>(Code::cast(functions->get(i))); | 211 Handle<Code> function = Handle<Code>(Code::cast(functions->get(i))); |
| 195 AllowDeferredHandleDereference embedding_raw_address; | 212 AllowDeferredHandleDereference embedding_raw_address; |
| 196 int mask = (1 << RelocInfo::WASM_MEMORY_REFERENCE) | | 213 int mask = UpdateReferencesMask(false); |
| 197 (1 << RelocInfo::WASM_MEMORY_SIZE_REFERENCE); | |
| 198 for (RelocIterator it(*function, mask); !it.done(); it.next()) { | 214 for (RelocIterator it(*function, mask); !it.done(); it.next()) { |
| 199 it.rinfo()->update_wasm_memory_reference(old_start, start, prev_size, | 215 it.rinfo()->update_wasm_memory_reference(old_start, start, prev_size, |
| 200 new_size); | 216 new_size); |
| 201 } | 217 } |
| 202 } | 218 } |
| 203 } | 219 } |
| 204 | 220 |
| 205 void RelocateGlobals(Handle<JSObject> instance, Address old_start, | 221 void RelocateGlobals(Handle<JSObject> instance, Address old_start, |
| 206 Address globals_start) { | 222 Address globals_start) { |
| 207 Handle<FixedArray> functions = Handle<FixedArray>( | 223 Handle<FixedArray> functions = Handle<FixedArray>( |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 Object* mem_start = compiled_module->ptr_to_heap(); | 633 Object* mem_start = compiled_module->ptr_to_heap(); |
| 618 Address old_mem_address = nullptr; | 634 Address old_mem_address = nullptr; |
| 619 Address globals_start = | 635 Address globals_start = |
| 620 GetGlobalStartAddressFromCodeTemplate(undefined, owner); | 636 GetGlobalStartAddressFromCodeTemplate(undefined, owner); |
| 621 | 637 |
| 622 if (old_mem_size > 0) { | 638 if (old_mem_size > 0) { |
| 623 CHECK_NE(mem_start, undefined); | 639 CHECK_NE(mem_start, undefined); |
| 624 old_mem_address = | 640 old_mem_address = |
| 625 static_cast<Address>(JSArrayBuffer::cast(mem_start)->backing_store()); | 641 static_cast<Address>(JSArrayBuffer::cast(mem_start)->backing_store()); |
| 626 } | 642 } |
| 627 int mode_mask = RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_REFERENCE) | | 643 int mode_mask = UpdateReferencesMask(true); |
| 628 RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_SIZE_REFERENCE) | | |
| 629 RelocInfo::ModeMask(RelocInfo::WASM_GLOBAL_REFERENCE); | |
| 630 | 644 |
| 631 Object* fct_obj = compiled_module->ptr_to_code_table(); | 645 Object* fct_obj = compiled_module->ptr_to_code_table(); |
| 632 if (fct_obj != nullptr && fct_obj != undefined && | 646 if (fct_obj != nullptr && fct_obj != undefined && |
| 633 (old_mem_size > 0 || globals_start != nullptr)) { | 647 (old_mem_size > 0 || globals_start != nullptr)) { |
| 634 FixedArray* functions = FixedArray::cast(fct_obj); | 648 FixedArray* functions = FixedArray::cast(fct_obj); |
| 635 for (int i = 0; i < functions->length(); ++i) { | 649 for (int i = 0; i < functions->length(); ++i) { |
| 636 Code* code = Code::cast(functions->get(i)); | 650 Code* code = Code::cast(functions->get(i)); |
| 637 bool changed = false; | 651 bool changed = false; |
| 638 for (RelocIterator it(code, mode_mask); !it.done(); it.next()) { | 652 for (RelocIterator it(code, mode_mask); !it.done(); it.next()) { |
| 639 RelocInfo::Mode mode = it.rinfo()->rmode(); | 653 RelocInfo::Mode mode = it.rinfo()->rmode(); |
| (...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2029 // Get code table associated with the module js_object | 2043 // Get code table associated with the module js_object |
| 2030 Object* obj = object->GetInternalField(kWasmModuleCodeTable); | 2044 Object* obj = object->GetInternalField(kWasmModuleCodeTable); |
| 2031 Handle<FixedArray> code_table(FixedArray::cast(obj)); | 2045 Handle<FixedArray> code_table(FixedArray::cast(obj)); |
| 2032 | 2046 |
| 2033 // Iterate through the code objects in the code table and update relocation | 2047 // Iterate through the code objects in the code table and update relocation |
| 2034 // information | 2048 // information |
| 2035 for (int i = 0; i < code_table->length(); ++i) { | 2049 for (int i = 0; i < code_table->length(); ++i) { |
| 2036 obj = code_table->get(i); | 2050 obj = code_table->get(i); |
| 2037 Handle<Code> code(Code::cast(obj)); | 2051 Handle<Code> code(Code::cast(obj)); |
| 2038 | 2052 |
| 2039 int mode_mask = RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_REFERENCE) | | 2053 int mode_mask = UpdateReferencesMask(false); |
| 2040 RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_SIZE_REFERENCE); | |
| 2041 for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) { | 2054 for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) { |
| 2042 RelocInfo::Mode mode = it.rinfo()->rmode(); | 2055 RelocInfo::Mode mode = it.rinfo()->rmode(); |
| 2043 if (RelocInfo::IsWasmMemoryReference(mode) || | 2056 if (RelocInfo::IsWasmMemoryReference(mode) || |
| 2044 RelocInfo::IsWasmMemorySizeReference(mode)) { | 2057 RelocInfo::IsWasmMemorySizeReference(mode)) { |
| 2045 it.rinfo()->update_wasm_memory_reference(old_start, new_start, old_size, | 2058 it.rinfo()->update_wasm_memory_reference(old_start, new_start, old_size, |
| 2046 new_size); | 2059 new_size); |
| 2047 } | 2060 } |
| 2048 } | 2061 } |
| 2049 } | 2062 } |
| 2050 return true; | 2063 return true; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2189 } | 2202 } |
| 2190 Address old_mem_start = nullptr; | 2203 Address old_mem_start = nullptr; |
| 2191 uint32_t old_size = 0, new_size = 0; | 2204 uint32_t old_size = 0, new_size = 0; |
| 2192 | 2205 |
| 2193 MaybeHandle<JSArrayBuffer> maybe_mem_buffer = | 2206 MaybeHandle<JSArrayBuffer> maybe_mem_buffer = |
| 2194 GetInstanceMemory(isolate, instance); | 2207 GetInstanceMemory(isolate, instance); |
| 2195 Handle<JSArrayBuffer> old_buffer; | 2208 Handle<JSArrayBuffer> old_buffer; |
| 2196 if (!maybe_mem_buffer.ToHandle(&old_buffer)) { | 2209 if (!maybe_mem_buffer.ToHandle(&old_buffer)) { |
| 2197 // If module object does not have linear memory associated with it, | 2210 // If module object does not have linear memory associated with it, |
| 2198 // Allocate new array buffer of given size. | 2211 // Allocate new array buffer of given size. |
| 2199 // TODO(gdeepti): Fix bounds check to take into account size of memtype. | |
| 2200 new_size = pages * WasmModule::kPageSize; | 2212 new_size = pages * WasmModule::kPageSize; |
| 2201 // The code generated in the wasm compiler guarantees this precondition. | 2213 // The code generated in the wasm compiler guarantees this precondition. |
| 2202 DCHECK(pages <= WasmModule::kMaxMemPages); | 2214 DCHECK(pages <= WasmModule::kMaxMemPages); |
| 2203 } else { | 2215 } else { |
| 2204 old_mem_start = static_cast<Address>(old_buffer->backing_store()); | 2216 old_mem_start = static_cast<Address>(old_buffer->backing_store()); |
| 2205 old_size = old_buffer->byte_length()->Number(); | 2217 old_size = old_buffer->byte_length()->Number(); |
| 2206 // If the old memory was zero-sized, we should have been in the | 2218 // If the old memory was zero-sized, we should have been in the |
| 2207 // "undefined" case above. | 2219 // "undefined" case above. |
| 2208 DCHECK_NOT_NULL(old_mem_start); | 2220 DCHECK_NOT_NULL(old_mem_start); |
| 2209 DCHECK_NE(0, old_size); | 2221 DCHECK_NE(0, old_size); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2278 WasmCompiledModule* compiled_module = | 2290 WasmCompiledModule* compiled_module = |
| 2279 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); | 2291 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); |
| 2280 CHECK(compiled_module->has_weak_module_object()); | 2292 CHECK(compiled_module->has_weak_module_object()); |
| 2281 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); | 2293 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); |
| 2282 } | 2294 } |
| 2283 | 2295 |
| 2284 } // namespace testing | 2296 } // namespace testing |
| 2285 } // namespace wasm | 2297 } // namespace wasm |
| 2286 } // namespace internal | 2298 } // namespace internal |
| 2287 } // namespace v8 | 2299 } // namespace v8 |
| OLD | NEW |