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

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

Issue 1928933002: [wasm] Generated the framework in wasm-module for parallel compilation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: TODO removed. Created 4 years, 8 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 7060157368e12e254c00c83ff6997c897cfeb096..e53ec0f17e56c897f28590c8e247725be0452412 100644
--- a/src/wasm/wasm-module.cc
+++ b/src/wasm/wasm-module.cc
@@ -491,12 +491,37 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
isolate->counters()->wasm_functions_per_module()->AddSample(
static_cast<int>(functions.size()));
+ std::vector<compiler::WasmCompilationUnit*> compilation_units(
+ functions.size());
+ if (FLAG_wasm_parallel_compilation) {
+ // Create a placeholder code object for all functions.
+ // TODO(ahaas): Maybe we could skip this for external functions.
+ for (uint32_t i = 0; i < functions.size(); i++) {
+ linker.GetFunctionCode(i);
+ }
+
+ for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size();
+ i++) {
+ if (!functions[i].external) {
+ compilation_units[i] = compiler::CreateWasmCompilationUnit(
+ &thrower, isolate, &module_env, &functions[i]);
+ }
+ }
+
+ for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size();
+ i++) {
+ if (!functions[i].external) {
+ compiler::ExecuteCompilation(compilation_units[i]);
+ }
+ }
+ }
+
// First pass: compile each function and initialize the code table.
- index = FLAG_skip_compiling_wasm_funcs;
- while (index < functions.size()) {
- const WasmFunction& func = functions[index];
+ for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size();
+ i++) {
+ const WasmFunction& func = functions[i];
if (thrower.error()) break;
- DCHECK_EQ(index, func.func_index);
+ DCHECK_EQ(i, func.func_index);
WasmName str = GetName(func.name_offset, func.name_length);
WasmName str_null = {nullptr, 0};
@@ -506,36 +531,39 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
if (func.external) {
// Lookup external function in FFI object.
MaybeHandle<JSFunction> function =
- LookupFunction(thrower, factory, ffi, index, str, str_null);
+ LookupFunction(thrower, factory, ffi, i, str, str_null);
if (function.is_null()) return MaybeHandle<JSObject>();
code = compiler::CompileWasmToJSWrapper(isolate, &module_env,
function.ToHandleChecked(),
func.sig, str, str_null);
} else {
- // Compile the function.
- code =
- compiler::CompileWasmFunction(thrower, isolate, &module_env, func);
+ if (FLAG_wasm_parallel_compilation) {
+ code = compiler::FinishCompilation(compilation_units[i]);
+ } else {
+ // Compile the function.
+ code = compiler::CompileWasmFunction(&thrower, isolate, &module_env,
+ &func);
+ }
if (code.is_null()) {
- thrower.Error("Compilation of #%d:%.*s failed.", index, str.length(),
+ thrower.Error("Compilation of #%d:%.*s failed.", i, str.length(),
str.start());
return MaybeHandle<JSObject>();
}
if (func.exported) {
function = compiler::CompileJSToWasmWrapper(
- isolate, &module_env, name, code, instance.js_object, index);
+ isolate, &module_env, name, code, instance.js_object, i);
}
}
if (!code.is_null()) {
// Install the code into the linker table.
- linker.Finish(index, code);
- code_table->set(index, *code);
+ linker.Finish(i, code);
+ code_table->set(i, *code);
}
if (func.exported) {
// Exported functions are installed as read-only properties on the
// module.
JSObject::AddProperty(instance.js_object, name, function, READ_ONLY);
}
- index++;
}
// Second pass: patch all direct call sites.
@@ -547,7 +575,6 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
// Create and populate the exports object.
//-------------------------------------------------------------------------
if (export_table.size() > 0 || mem_export) {
- index = 0;
// Create the "exports" object.
Handle<JSFunction> object_function = Handle<JSFunction>(
isolate->native_context()->object_function(), isolate);
@@ -682,7 +709,7 @@ int32_t CompileAndRunWasmModule(Isolate* isolate, WasmModule* module) {
if (!func.external) {
// Compile the function and install it in the code table.
Handle<Code> code =
- compiler::CompileWasmFunction(thrower, isolate, &module_env, func);
+ compiler::CompileWasmFunction(&thrower, isolate, &module_env, &func);
if (!code.is_null()) {
if (func.exported) {
main_code = code;
« 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