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

Unified Diff: src/wasm/wasm-module.cc

Issue 2784453002: [wasm] Fix serialization after instantiation (Closed)
Patch Set: feedback Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/wasm/wasm-debug.cc ('k') | src/wasm/wasm-objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-module.cc
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
index cfffcec07e7d7dd5aa83ba9e115e7b0ebb5b552a..5935a6e107567bd89dc6be5c5f18d8fcf866859c 100644
--- a/src/wasm/wasm-module.cc
+++ b/src/wasm/wasm-module.cc
@@ -649,77 +649,6 @@ class CompilationHelper {
}
};
-static void ResetCompiledModule(Isolate* isolate, WasmInstanceObject* owner,
- WasmCompiledModule* compiled_module) {
- TRACE("Resetting %d\n", compiled_module->instance_id());
- Object* undefined = *isolate->factory()->undefined_value();
- Object* fct_obj = compiled_module->ptr_to_code_table();
- if (fct_obj != nullptr && fct_obj != undefined) {
- uint32_t old_mem_size = compiled_module->mem_size();
- uint32_t default_mem_size = compiled_module->default_mem_size();
- Object* mem_start = compiled_module->maybe_ptr_to_memory();
-
- // Patch code to update memory references, global references, and function
- // table references.
- Zone specialization_zone(isolate->allocator(), ZONE_NAME);
- CodeSpecialization code_specialization(isolate, &specialization_zone);
-
- if (old_mem_size > 0) {
- CHECK_NE(mem_start, undefined);
- Address old_mem_address =
- static_cast<Address>(JSArrayBuffer::cast(mem_start)->backing_store());
- code_specialization.RelocateMemoryReferences(
- old_mem_address, old_mem_size, nullptr, default_mem_size);
- }
-
- if (owner->has_globals_buffer()) {
- Address globals_start =
- static_cast<Address>(owner->globals_buffer()->backing_store());
- code_specialization.RelocateGlobals(globals_start, nullptr);
- }
-
- // Reset function tables.
- if (compiled_module->has_function_tables()) {
- FixedArray* function_tables = compiled_module->ptr_to_function_tables();
- FixedArray* empty_function_tables =
- compiled_module->ptr_to_empty_function_tables();
- DCHECK_EQ(function_tables->length(), empty_function_tables->length());
- for (int i = 0, e = function_tables->length(); i < e; ++i) {
- code_specialization.RelocateObject(
- handle(function_tables->get(i), isolate),
- handle(empty_function_tables->get(i), isolate));
- }
- compiled_module->set_ptr_to_function_tables(empty_function_tables);
- }
-
- FixedArray* functions = FixedArray::cast(fct_obj);
- for (int i = compiled_module->num_imported_functions(),
- end = functions->length();
- i < end; ++i) {
- Code* code = Code::cast(functions->get(i));
- // Skip lazy compile stubs.
- if (code->builtin_index() == Builtins::kWasmCompileLazy) continue;
- if (code->kind() != Code::WASM_FUNCTION) {
- // From here on, there should only be wrappers for exported functions.
- for (; i < end; ++i) {
- DCHECK_EQ(Code::JS_TO_WASM_FUNCTION,
- Code::cast(functions->get(i))->kind());
- }
- break;
- }
- bool changed =
- code_specialization.ApplyToWasmCode(code, SKIP_ICACHE_FLUSH);
- // TODO(wasm): Check if this is faster than passing FLUSH_ICACHE_IF_NEEDED
- // above.
- if (changed) {
- Assembler::FlushICache(isolate, code->instruction_start(),
- code->instruction_size());
- }
- }
- }
- compiled_module->reset_memory();
-}
-
static void MemoryInstanceFinalizer(Isolate* isolate,
WasmInstanceObject* instance) {
DisallowHeapAllocation no_gc;
@@ -805,7 +734,7 @@ static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
if (current_template == compiled_module) {
if (next == nullptr) {
- ResetCompiledModule(isolate, owner, compiled_module);
+ WasmCompiledModule::Reset(isolate, compiled_module);
} else {
DCHECK(next->value()->IsFixedArray());
wasm_module->SetEmbedderField(0, next->value());
@@ -1268,15 +1197,17 @@ class InstantiationHelper {
thrower_->RangeError("Out of memory: wasm globals");
return {};
}
- Address old_globals_start = nullptr;
- if (!owner.is_null()) {
- DCHECK(owner.ToHandleChecked()->has_globals_buffer());
- old_globals_start = static_cast<Address>(
- owner.ToHandleChecked()->globals_buffer()->backing_store());
- }
+ Address old_globals_start = compiled_module_->GetGlobalsStartOrNull();
Address new_globals_start =
static_cast<Address>(global_buffer->backing_store());
code_specialization.RelocateGlobals(old_globals_start, new_globals_start);
+ // The address of the backing buffer for the golbals is in native memory
+ // and, thus, not moving. We need it saved for
+ // serialization/deserialization purposes - so that the other end
+ // understands how to relocate the references. We still need to save the
+ // JSArrayBuffer on the instance, to keep it all alive.
+ WasmCompiledModule::SetGlobalsStartAddressFrom(factory, compiled_module_,
+ global_buffer);
instance->set_globals_buffer(*global_buffer);
}
@@ -1312,8 +1243,6 @@ class InstantiationHelper {
//--------------------------------------------------------------------------
// Set up the memory for the new instance.
//--------------------------------------------------------------------------
- MaybeHandle<JSArrayBuffer> old_memory;
-
uint32_t min_mem_pages = module_->min_mem_pages;
(module_->is_wasm() ? isolate_->counters()->wasm_wasm_min_mem_pages_count()
: isolate_->counters()->wasm_asm_min_mem_pages_count())
@@ -1362,25 +1291,24 @@ class InstantiationHelper {
// Initialize memory.
//--------------------------------------------------------------------------
if (!memory_.is_null()) {
- instance->set_memory_buffer(*memory_);
Address mem_start = static_cast<Address>(memory_->backing_store());
uint32_t mem_size =
static_cast<uint32_t>(memory_->byte_length()->Number());
LoadDataSegments(mem_start, mem_size);
uint32_t old_mem_size = compiled_module_->mem_size();
- Address old_mem_start =
- compiled_module_->has_memory()
- ? static_cast<Address>(
- compiled_module_->memory()->backing_store())
- : nullptr;
+ Address old_mem_start = compiled_module_->GetEmbeddedMemStartOrNull();
// We might get instantiated again with the same memory. No patching
// needed in this case.
if (old_mem_start != mem_start || old_mem_size != mem_size) {
code_specialization.RelocateMemoryReferences(
old_mem_start, old_mem_size, mem_start, mem_size);
}
- compiled_module_->set_memory(memory_);
+ // Just like with globals, we need to keep both the JSArrayBuffer
+ // and save the start pointer.
+ instance->set_memory_buffer(*memory_);
+ WasmCompiledModule::SetSpecializationMemInfoFrom(
+ factory, compiled_module_, memory_);
}
//--------------------------------------------------------------------------
@@ -2318,11 +2246,12 @@ MaybeHandle<JSArrayBuffer> wasm::GetInstanceMemory(
return MaybeHandle<JSArrayBuffer>();
}
-void SetInstanceMemory(Handle<WasmInstanceObject> instance,
- JSArrayBuffer* buffer) {
- DisallowHeapAllocation no_gc;
- instance->set_memory_buffer(buffer);
- instance->compiled_module()->set_ptr_to_memory(buffer);
+// May GC, because SetSpecializationMemInfoFrom may GC
+void SetInstanceMemory(Isolate* isolate, Handle<WasmInstanceObject> instance,
+ Handle<JSArrayBuffer> buffer) {
+ instance->set_memory_buffer(*buffer);
+ WasmCompiledModule::SetSpecializationMemInfoFrom(
+ isolate->factory(), handle(instance->compiled_module()), buffer);
}
int32_t wasm::GetInstanceMemorySize(Isolate* isolate,
@@ -2495,14 +2424,14 @@ int32_t wasm::GrowWebAssemblyMemory(Isolate* isolate,
new_buffer = GrowMemoryBuffer(isolate, memory_buffer, pages, max_pages);
if (new_buffer.is_null()) return -1;
DCHECK(!instance_wrapper->has_previous());
- SetInstanceMemory(instance, *new_buffer);
+ SetInstanceMemory(isolate, instance, new_buffer);
UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size);
while (instance_wrapper->has_next()) {
instance_wrapper = instance_wrapper->next_wrapper();
DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper));
Handle<WasmInstanceObject> instance = instance_wrapper->instance_object();
DCHECK(IsWasmInstance(*instance));
- SetInstanceMemory(instance, *new_buffer);
+ SetInstanceMemory(isolate, instance, new_buffer);
UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size);
}
}
@@ -2532,7 +2461,7 @@ int32_t wasm::GrowMemory(Isolate* isolate, Handle<WasmInstanceObject> instance,
Handle<JSArrayBuffer> buffer =
GrowMemoryBuffer(isolate, instance_buffer, pages, max_pages);
if (buffer.is_null()) return -1;
- SetInstanceMemory(instance, *buffer);
+ SetInstanceMemory(isolate, instance, buffer);
UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size);
DCHECK(old_size % WasmModule::kPageSize == 0);
return (old_size / WasmModule::kPageSize);
@@ -3110,7 +3039,7 @@ bool LazyCompilationOrchestrator::CompileFunction(
CodeSpecialization code_specialization(isolate, &specialization_zone);
if (module_env.module->globals_size) {
Address globals_start =
- reinterpret_cast<Address>(instance->globals_buffer()->backing_store());
+ reinterpret_cast<Address>(compiled_module->globals_start());
code_specialization.RelocateGlobals(nullptr, globals_start);
}
if (instance->has_memory_buffer()) {
« no previous file with comments | « src/wasm/wasm-debug.cc ('k') | src/wasm/wasm-objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698