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 |