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

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

Issue 2008043006: [wasm] separate snapshot-able stages (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@refactoring
Patch Set: Created 4 years, 7 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-module.h ('k') | no next file » | 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 3ba9a9f1ac1b7718d5416fd26c8c6bc3dc035afe..5d8ab1923f7955a5b2ad11f54bab7bfbe3894ac5 100644
--- a/src/wasm/wasm-module.cc
+++ b/src/wasm/wasm-module.cc
@@ -419,12 +419,6 @@ void InitializeParallelCompilation(
Isolate* isolate, const std::vector<WasmFunction>& functions,
std::vector<compiler::WasmCompilationUnit*>& compilation_units,
ModuleEnv& module_env, ErrorThrower& thrower) {
- // Create a placeholder code object for all functions.
- // TODO(ahaas): Maybe we could skip this for external functions.
titzer 2016/05/26 15:12:25 Why did you delete this code? It's necessary to cr
Mircea Trofin 2016/05/26 15:53:18 The CL has the refactoring one as a dependency. Th
- for (uint32_t i = 0; i < functions.size(); i++) {
- module_env.linker->GetFunctionCode(i);
- }
-
for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size(); i++) {
compilation_units[i] = new compiler::WasmCompilationUnit(
&thrower, isolate, &module_env, &functions[i], i);
@@ -486,15 +480,11 @@ void FinishCompilationUnits(
}
}
-bool FinishCompilation(Isolate* isolate, const WasmModule* module,
- const Handle<JSReceiver> ffi,
- const std::vector<Handle<Code>>& results,
- const WasmModuleInstance& instance,
- const Handle<FixedArray>& code_table,
- ErrorThrower& thrower, Factory* factory,
- ModuleEnv& module_env, CodeStats& code_stats,
- PropertyDescriptor& desc) {
- if (thrower.error()) return false;
+void CompileSequentially(Isolate* isolate, WasmModuleInstance* instance,
titzer 2016/05/26 15:12:25 I like the old name better.
Mircea Trofin 2016/05/26 15:53:18 It doesn't finish anything anymore now. It does th
+ ErrorThrower* thrower, ModuleEnv* module_env) {
+ DCHECK(!thrower->error());
+ const WasmModule* module = instance->module();
+
for (uint32_t i = FLAG_skip_compiling_wasm_funcs;
i < module->functions.size(); i++) {
const WasmFunction& func = module->functions[i];
@@ -502,26 +492,17 @@ bool FinishCompilation(Isolate* isolate, const WasmModule* module,
DCHECK_EQ(i, func.func_index);
WasmName str = module->GetName(func.name_offset, func.name_length);
Handle<Code> code = Handle<Code>::null();
- if (FLAG_wasm_num_compilation_tasks != 0) {
titzer 2016/05/26 15:12:25 wat
Mircea Trofin 2016/05/26 15:53:17 Typo?
- code = results[i];
- } else {
- // Compile the function.
- code = compiler::WasmCompilationUnit::CompileWasmFunction(
- &thrower, isolate, &module_env, &func);
- }
+ // Compile the function.
+ code = compiler::WasmCompilationUnit::CompileWasmFunction(
+ thrower, isolate, module_env, &func);
if (code.is_null()) {
- thrower.Error("Compilation of #%d:%.*s failed.", i, str.length(),
- str.start());
- return false;
+ thrower->Error("Compilation of #%d:%.*s failed.", i, str.length(),
+ str.start());
+ break;
}
- if (!code.is_null()) {
// Install the code into the linker table.
- module_env.linker->Finish(i, code);
- code_table->set(i, *code);
- code_stats.Record(*code);
- }
+ instance->function_code()[i] = code;
}
- return true;
}
} // namespace
@@ -621,6 +602,23 @@ void WasmModuleInstance::InitializeFunctions() {
}
}
+void WasmModuleInstance::ProcessFunctionsPostLinking() {
titzer 2016/05/26 15:12:25 Please name this function for what it does. SetDeo
Mircea Trofin 2016/05/26 15:53:18 Agreed.
Mircea Trofin 2016/05/27 01:17:33 Actually... Perhaps SetStackTracingHelpers may be
+ for (size_t i = FLAG_skip_compiling_wasm_funcs; i < function_code().size();
+ ++i) {
+ Handle<Code> code = function_code()[i];
+ DCHECK(code->deoptimization_data() == nullptr ||
+ code->deoptimization_data()->length() == 0);
+ Handle<FixedArray> deopt_data =
+ isolate_->factory()->NewFixedArray(2, TENURED);
+ if (!js_object().is_null()) {
+ deopt_data->set(0, *js_object());
+ }
+ deopt_data->set(1, Smi::FromInt(static_cast<int>(i)));
+ deopt_data->set_length(2);
+ code->set_deoptimization_data(*deopt_data);
+ }
+}
+
// Instantiates a wasm module as a JSObject.
// * allocates a backing store of {mem_size} bytes.
// * installs a named property "memory" for that buffer if exported
@@ -634,9 +632,6 @@ MaybeHandle<JSObject> WasmModule::Instantiate(
ErrorThrower thrower(isolate, "WasmModule::Instantiate()");
Factory* factory = isolate->factory();
- PropertyDescriptor desc;
- desc.set_writable(false);
-
// If FLAG_print_wasm_code_size is set, this aggregates the sum of all code
// objects created for this module.
// TODO(titzer): switch this to TRACE_EVENT
@@ -702,7 +697,6 @@ MaybeHandle<JSObject> WasmModule::Instantiate(
std::vector<compiler::WasmCompilationUnit*> compilation_units(
functions.size());
std::queue<compiler::WasmCompilationUnit*> executed_units;
- std::vector<Handle<Code>> results(functions.size());
if (FLAG_wasm_num_compilation_tasks != 0) {
//-----------------------------------------------------------------------
@@ -753,25 +747,39 @@ MaybeHandle<JSObject> WasmModule::Instantiate(
// dequeues it and finishes the compilation unit. Compilation units
// are finished concurrently to the background threads to save
// memory.
- FinishCompilationUnits(executed_units, results, result_mutex);
+ FinishCompilationUnits(executed_units, instance.function_code(),
+ result_mutex);
}
// 4) After the parallel phase of all compilation units has started, the
// main thread waits for all {WasmCompilationTask} instances to finish.
WaitForCompilationTasks(isolate, task_ids.get(), pending_tasks);
// Finish the compilation of the remaining compilation units.
- FinishCompilationUnits(executed_units, results, result_mutex);
+ FinishCompilationUnits(executed_units, instance.function_code(),
+ result_mutex);
+ } else {
+ // 5) The main thread finishes the compilation.
+ CompileSequentially(isolate, &instance, &thrower, &module_env);
}
- // 5) The main thread finishes the compilation.
- if (!FinishCompilation(isolate, this, ffi, results, instance, code_table,
- thrower, factory, module_env, code_stats, desc)) {
+ if (thrower.error()) {
return Handle<JSObject>::null();
}
+ // At this point, compilation has completed. Update the code table
+ // and record sizes.
+ for (size_t i = FLAG_skip_compiling_wasm_funcs;
+ i < instance.function_code().size(); ++i) {
+ Code* code = *instance.function_code()[i];
+ code_table->set(static_cast<int>(i), code);
+ code_stats.Record(code);
+ }
+
// Patch all direct call sites.
linker.Link(instance.function_table(), this->function_table);
instance.js_object()->SetInternalField(kWasmModuleFunctionTable,
Smi::FromInt(0));
+ instance.ProcessFunctionsPostLinking();
+
//-------------------------------------------------------------------------
// Create and populate the exports object.
//-------------------------------------------------------------------------
@@ -790,6 +798,9 @@ MaybeHandle<JSObject> WasmModule::Instantiate(
exports_object = instance.js_object();
}
+ PropertyDescriptor desc;
+ desc.set_writable(false);
+
// Compile wrappers and add them to the exports object.
for (const WasmExport& exp : export_table) {
if (thrower.error()) break;
« no previous file with comments | « src/wasm/wasm-module.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698