Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Side by Side Diff: src/wasm/wasm-module.cc

Issue 2626313003: [wasm] Change the constant kV8MaxWasmMemoryPages to a command line flag. (Closed)
Patch Set: allow all unsigned ints Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 737 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 Vector<const uint8_t>(reinterpret_cast<uint8_t*>(buffer), name_chars), 748 Vector<const uint8_t>(reinterpret_cast<uint8_t*>(buffer), name_chars),
749 TENURED); 749 TENURED);
750 script->set_name(*name_str.ToHandleChecked()); 750 script->set_name(*name_str.ToHandleChecked());
751 751
752 return script; 752 return script;
753 } 753 }
754 } // namespace 754 } // namespace
755 755
756 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, 756 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size,
757 bool enable_guard_regions) { 757 bool enable_guard_regions) {
758 if (size > (kV8MaxWasmMemoryPages * WasmModule::kPageSize)) { 758 if (size > (FLAG_wasm_max_mem_pages * WasmModule::kPageSize)) {
759 // TODO(titzer): lift restriction on maximum memory allocated here. 759 // TODO(titzer): lift restriction on maximum memory allocated here.
760 return Handle<JSArrayBuffer>::null(); 760 return Handle<JSArrayBuffer>::null();
761 } 761 }
762 762
763 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; 763 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported;
764 764
765 bool is_external; // Set by TryAllocateBackingStore 765 bool is_external; // Set by TryAllocateBackingStore
766 void* memory = 766 void* memory =
767 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external); 767 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external);
768 768
(...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after
1825 break; 1825 break;
1826 default: 1826 default:
1827 UNREACHABLE(); 1827 UNREACHABLE();
1828 break; 1828 break;
1829 } 1829 }
1830 } 1830 }
1831 } 1831 }
1832 1832
1833 // Allocate memory for a module instance as a new JSArrayBuffer. 1833 // Allocate memory for a module instance as a new JSArrayBuffer.
1834 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) { 1834 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) {
1835 if (min_mem_pages > kV8MaxWasmMemoryPages) { 1835 if (min_mem_pages > FLAG_wasm_max_mem_pages) {
1836 thrower_->RangeError("Out of memory: wasm memory too large"); 1836 thrower_->RangeError("Out of memory: wasm memory too large");
1837 return Handle<JSArrayBuffer>::null(); 1837 return Handle<JSArrayBuffer>::null();
1838 } 1838 }
1839 const bool enable_guard_regions = EnableGuardRegions(); 1839 const bool enable_guard_regions = EnableGuardRegions();
1840 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer( 1840 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer(
1841 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions); 1841 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions);
1842 1842
1843 if (mem_buffer.is_null()) { 1843 if (mem_buffer.is_null()) {
1844 thrower_->RangeError("Out of memory: wasm memory"); 1844 thrower_->RangeError("Out of memory: wasm memory");
1845 } 1845 }
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
2266 return buffer->byte_length()->Number() / WasmModule::kPageSize; 2266 return buffer->byte_length()->Number() / WasmModule::kPageSize;
2267 } 2267 }
2268 } 2268 }
2269 2269
2270 uint32_t GetMaxInstanceMemoryPages(Isolate* isolate, 2270 uint32_t GetMaxInstanceMemoryPages(Isolate* isolate,
2271 Handle<WasmInstanceObject> instance) { 2271 Handle<WasmInstanceObject> instance) {
2272 if (instance->has_memory_object()) { 2272 if (instance->has_memory_object()) {
2273 Handle<WasmMemoryObject> memory_object(instance->memory_object(), isolate); 2273 Handle<WasmMemoryObject> memory_object(instance->memory_object(), isolate);
2274 if (memory_object->has_maximum_pages()) { 2274 if (memory_object->has_maximum_pages()) {
2275 uint32_t maximum = static_cast<uint32_t>(memory_object->maximum_pages()); 2275 uint32_t maximum = static_cast<uint32_t>(memory_object->maximum_pages());
2276 if (maximum < kV8MaxWasmMemoryPages) return maximum; 2276 if (maximum < FLAG_wasm_max_mem_pages) return maximum;
2277 } 2277 }
2278 } 2278 }
2279 uint32_t compiled_max_pages = instance->compiled_module()->max_mem_pages(); 2279 uint32_t compiled_max_pages = instance->compiled_module()->max_mem_pages();
2280 isolate->counters()->wasm_max_mem_pages_count()->AddSample( 2280 isolate->counters()->wasm_max_mem_pages_count()->AddSample(
2281 compiled_max_pages); 2281 compiled_max_pages);
2282 if (compiled_max_pages != 0) return compiled_max_pages; 2282 if (compiled_max_pages != 0) return compiled_max_pages;
2283 return kV8MaxWasmMemoryPages; 2283 return FLAG_wasm_max_mem_pages;
2284 } 2284 }
2285 2285
2286 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, 2286 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate,
2287 MaybeHandle<JSArrayBuffer> buffer, 2287 MaybeHandle<JSArrayBuffer> buffer,
2288 uint32_t pages, uint32_t max_pages) { 2288 uint32_t pages, uint32_t max_pages) {
2289 Handle<JSArrayBuffer> old_buffer; 2289 Handle<JSArrayBuffer> old_buffer;
2290 Address old_mem_start = nullptr; 2290 Address old_mem_start = nullptr;
2291 uint32_t old_size = 0; 2291 uint32_t old_size = 0;
2292 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { 2292 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) {
2293 old_mem_start = static_cast<Address>(old_buffer->backing_store()); 2293 old_mem_start = static_cast<Address>(old_buffer->backing_store());
2294 DCHECK_NOT_NULL(old_mem_start); 2294 DCHECK_NOT_NULL(old_mem_start);
2295 old_size = old_buffer->byte_length()->Number(); 2295 old_size = old_buffer->byte_length()->Number();
2296 } 2296 }
2297 DCHECK(old_size + pages * WasmModule::kPageSize <= 2297 DCHECK(old_size + pages * WasmModule::kPageSize <=
2298 std::numeric_limits<uint32_t>::max()); 2298 std::numeric_limits<uint32_t>::max());
2299 uint32_t new_size = old_size + pages * WasmModule::kPageSize; 2299 uint32_t new_size = old_size + pages * WasmModule::kPageSize;
2300 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size || 2300 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size ||
2301 kV8MaxWasmMemoryPages * WasmModule::kPageSize < new_size) { 2301 FLAG_wasm_max_mem_pages * WasmModule::kPageSize < new_size) {
2302 return Handle<JSArrayBuffer>::null(); 2302 return Handle<JSArrayBuffer>::null();
2303 } 2303 }
2304 2304
2305 Handle<JSArrayBuffer> new_buffer; 2305 Handle<JSArrayBuffer> new_buffer;
2306 if (!old_buffer.is_null() && old_buffer->has_guard_region()) { 2306 if (!old_buffer.is_null() && old_buffer->has_guard_region()) {
2307 // We don't move the backing store, we simply change the protection to make 2307 // We don't move the backing store, we simply change the protection to make
2308 // more of it accessible. 2308 // more of it accessible.
2309 base::OS::Unprotect(old_buffer->backing_store(), new_size); 2309 base::OS::Unprotect(old_buffer->backing_store(), new_size);
2310 reinterpret_cast<v8::Isolate*>(isolate) 2310 reinterpret_cast<v8::Isolate*>(isolate)
2311 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize); 2311 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2358 if (pages == 0) { 2358 if (pages == 0) {
2359 DCHECK(old_size % WasmModule::kPageSize == 0); 2359 DCHECK(old_size % WasmModule::kPageSize == 0);
2360 return (old_size / WasmModule::kPageSize); 2360 return (old_size / WasmModule::kPageSize);
2361 } 2361 }
2362 Handle<JSArrayBuffer> new_buffer; 2362 Handle<JSArrayBuffer> new_buffer;
2363 if (!memory_object->has_instances_link()) { 2363 if (!memory_object->has_instances_link()) {
2364 // Memory object does not have an instance associated with it, just grow 2364 // Memory object does not have an instance associated with it, just grow
2365 uint32_t max_pages; 2365 uint32_t max_pages;
2366 if (memory_object->has_maximum_pages()) { 2366 if (memory_object->has_maximum_pages()) {
2367 max_pages = static_cast<uint32_t>(memory_object->maximum_pages()); 2367 max_pages = static_cast<uint32_t>(memory_object->maximum_pages());
2368 if (kV8MaxWasmMemoryPages < max_pages) return -1; 2368 if (FLAG_wasm_max_mem_pages < max_pages) return -1;
2369 } else { 2369 } else {
2370 max_pages = kV8MaxWasmMemoryPages; 2370 max_pages = FLAG_wasm_max_mem_pages;
2371 } 2371 }
2372 new_buffer = GrowMemoryBuffer(isolate, memory_buffer, pages, max_pages); 2372 new_buffer = GrowMemoryBuffer(isolate, memory_buffer, pages, max_pages);
2373 if (new_buffer.is_null()) return -1; 2373 if (new_buffer.is_null()) return -1;
2374 } else { 2374 } else {
2375 Handle<WasmInstanceWrapper> instance_wrapper( 2375 Handle<WasmInstanceWrapper> instance_wrapper(
2376 memory_object->instances_link()); 2376 memory_object->instances_link());
2377 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper)); 2377 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper));
2378 DCHECK(instance_wrapper->has_instance()); 2378 DCHECK(instance_wrapper->has_instance());
2379 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object(); 2379 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object();
2380 DCHECK(IsWasmInstance(*instance)); 2380 DCHECK(IsWasmInstance(*instance));
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
2639 2639
2640 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), 2640 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(),
2641 NONE); 2641 NONE);
2642 JSObject::AddProperty(entry, kind_string, export_kind, NONE); 2642 JSObject::AddProperty(entry, kind_string, export_kind, NONE);
2643 2643
2644 storage->set(index, *entry); 2644 storage->set(index, *entry);
2645 } 2645 }
2646 2646
2647 return array_object; 2647 return array_object;
2648 } 2648 }
OLDNEW
« src/flags.cc ('K') | « src/wasm/wasm-limits.h ('k') | test/fuzzer/wasm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698