| Index: src/wasm/wasm-module.cc
|
| diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
|
| index 3363f8472955e6e88615e11b8ed37fa81d90992d..f406ee5f83fd7c0bc5f2b4232e3c4ca5aeb0129a 100644
|
| --- a/src/wasm/wasm-module.cc
|
| +++ b/src/wasm/wasm-module.cc
|
| @@ -72,16 +72,22 @@ static void MemoryFinalizer(const v8::WeakCallbackInfo<void>& data) {
|
| GlobalHandles::Destroy(reinterpret_cast<Object**>(p));
|
| }
|
|
|
| -static void RecordStats(Isolate* isolate, Code* code) {
|
| - isolate->counters()->wasm_generated_code_size()->Increment(code->body_size());
|
| - isolate->counters()->wasm_reloc_size()->Increment(
|
| - code->relocation_info()->length());
|
| +static void RecordStats(Isolate* isolate, Code* code, bool is_sync) {
|
| + if (is_sync) {
|
| + // TODO(karlschimpf): Make this work when asynchronous.
|
| + // https://bugs.chromium.org/p/v8/issues/detail?id=6361
|
| + isolate->counters()->wasm_generated_code_size()->Increment(
|
| + code->body_size());
|
| + isolate->counters()->wasm_reloc_size()->Increment(
|
| + code->relocation_info()->length());
|
| + }
|
| }
|
|
|
| -static void RecordStats(Isolate* isolate, Handle<FixedArray> functions) {
|
| +static void RecordStats(Isolate* isolate, Handle<FixedArray> functions,
|
| + bool is_sync) {
|
| DisallowHeapAllocation no_gc;
|
| for (int i = 0; i < functions->length(); ++i) {
|
| - RecordStats(isolate, Code::cast(functions->get(i)));
|
| + RecordStats(isolate, Code::cast(functions->get(i)), is_sync);
|
| }
|
| }
|
|
|
| @@ -304,8 +310,9 @@ class CompilationHelper {
|
| // In {CompileToModuleObject}, it will transfer ownership to the generated
|
| // {WasmModuleWrapper}. If this method is not called, ownership may be
|
| // reclaimed by explicitely releasing the {module_} field.
|
| - CompilationHelper(Isolate* isolate, std::unique_ptr<WasmModule> module)
|
| - : isolate_(isolate), module_(std::move(module)) {}
|
| + CompilationHelper(Isolate* isolate, std::unique_ptr<WasmModule> module,
|
| + bool is_sync)
|
| + : isolate_(isolate), module_(std::move(module)), is_sync_(is_sync) {}
|
|
|
| // The actual runnable task that performs compilations in the background.
|
| class CompilationTask : public CancelableTask {
|
| @@ -323,6 +330,7 @@ class CompilationHelper {
|
|
|
| Isolate* isolate_;
|
| std::unique_ptr<WasmModule> module_;
|
| + bool is_sync_;
|
| std::vector<std::unique_ptr<compiler::WasmCompilationUnit>>
|
| compilation_units_;
|
| std::queue<std::unique_ptr<compiler::WasmCompilationUnit>> executed_units_;
|
| @@ -360,9 +368,11 @@ class CompilationHelper {
|
| compilation_units_.reserve(funcs_to_compile);
|
| for (uint32_t i = start; i < num_funcs; ++i) {
|
| const WasmFunction* func = &functions[i];
|
| + constexpr bool is_sync = true;
|
| compilation_units_.push_back(
|
| std::unique_ptr<compiler::WasmCompilationUnit>(
|
| - new compiler::WasmCompilationUnit(isolate_, &module_env, func)));
|
| + new compiler::WasmCompilationUnit(isolate_, &module_env, func,
|
| + !is_sync)));
|
| }
|
| return funcs_to_compile;
|
| }
|
| @@ -528,12 +538,30 @@ class CompilationHelper {
|
| signature_tables->set(i, *temp_instance.signature_tables[i]);
|
| }
|
|
|
| - HistogramTimerScope wasm_compile_module_time_scope(
|
| - module_->is_wasm()
|
| - ? isolate_->counters()->wasm_compile_wasm_module_time()
|
| - : isolate_->counters()->wasm_compile_asm_module_time());
|
| + if (is_sync_) {
|
| + // TODO(karlschimpf): Make this work when asynchronous.
|
| + // https://bugs.chromium.org/p/v8/issues/detail?id=6361
|
| + HistogramTimerScope wasm_compile_module_time_scope(
|
| + module_->is_wasm()
|
| + ? isolate_->counters()->wasm_compile_wasm_module_time()
|
| + : isolate_->counters()->wasm_compile_asm_module_time());
|
| + return CompileToModuleObjectInternal(
|
| + thrower, wire_bytes, asm_js_script, asm_js_offset_table_bytes,
|
| + factory, &temp_instance, &function_tables, &signature_tables);
|
| + }
|
| + return CompileToModuleObjectInternal(
|
| + thrower, wire_bytes, asm_js_script, asm_js_offset_table_bytes, factory,
|
| + &temp_instance, &function_tables, &signature_tables);
|
| + }
|
|
|
| - ModuleBytesEnv module_env(module_.get(), &temp_instance, wire_bytes);
|
| + private:
|
| + MaybeHandle<WasmModuleObject> CompileToModuleObjectInternal(
|
| + ErrorThrower* thrower, const ModuleWireBytes& wire_bytes,
|
| + Handle<Script> asm_js_script,
|
| + Vector<const byte> asm_js_offset_table_bytes, Factory* factory,
|
| + WasmInstance* temp_instance, Handle<FixedArray>* function_tables,
|
| + Handle<FixedArray>* signature_tables) {
|
| + ModuleBytesEnv module_env(module_.get(), temp_instance, wire_bytes);
|
|
|
| // The {code_table} array contains import wrappers and functions (which
|
| // are both included in {functions.size()}, and export wrappers.
|
| @@ -554,12 +582,16 @@ class CompilationHelper {
|
| for (int i = 0, e = static_cast<int>(module_->functions.size()); i < e;
|
| ++i) {
|
| code_table->set(i, *init_builtin);
|
| - temp_instance.function_code[i] = init_builtin;
|
| + temp_instance->function_code[i] = init_builtin;
|
| }
|
|
|
| - (module_->is_wasm() ? isolate_->counters()->wasm_functions_per_wasm_module()
|
| - : isolate_->counters()->wasm_functions_per_asm_module())
|
| - ->AddSample(static_cast<int>(module_->functions.size()));
|
| + if (is_sync_)
|
| + // TODO(karlschimpf): Make this work when asynchronous.
|
| + // https://bugs.chromium.org/p/v8/issues/detail?id=6361
|
| + (module_->is_wasm()
|
| + ? isolate_->counters()->wasm_functions_per_wasm_module()
|
| + : isolate_->counters()->wasm_functions_per_asm_module())
|
| + ->AddSample(static_cast<int>(module_->functions.size()));
|
|
|
| if (!lazy_compile) {
|
| size_t funcs_to_compile =
|
| @@ -567,21 +599,21 @@ class CompilationHelper {
|
| if (!FLAG_trace_wasm_decoder && FLAG_wasm_num_compilation_tasks != 0 &&
|
| funcs_to_compile > 1) {
|
| // Avoid a race condition by collecting results into a second vector.
|
| - std::vector<Handle<Code>> results(temp_instance.function_code);
|
| + std::vector<Handle<Code>> results(temp_instance->function_code);
|
| CompileInParallel(&module_env, results, thrower);
|
| - temp_instance.function_code.swap(results);
|
| + temp_instance->function_code.swap(results);
|
| } else {
|
| - CompileSequentially(&module_env, temp_instance.function_code, thrower);
|
| + CompileSequentially(&module_env, temp_instance->function_code, thrower);
|
| }
|
| if (thrower->error()) return {};
|
| }
|
|
|
| // At this point, compilation has completed. Update the code table.
|
| for (size_t i = FLAG_skip_compiling_wasm_funcs;
|
| - i < temp_instance.function_code.size(); ++i) {
|
| - Code* code = *temp_instance.function_code[i];
|
| + i < temp_instance->function_code.size(); ++i) {
|
| + Code* code = *temp_instance->function_code[i];
|
| code_table->set(static_cast<int>(i), code);
|
| - RecordStats(isolate_, code);
|
| + RecordStats(isolate_, code, is_sync_);
|
| }
|
|
|
| // Create heap objects for script, module bytes and asm.js offset table to
|
| @@ -627,7 +659,7 @@ class CompilationHelper {
|
| // serializable. Instantiation may occur off a deserialized version of this
|
| // object.
|
| Handle<WasmCompiledModule> compiled_module = WasmCompiledModule::New(
|
| - isolate_, shared, code_table, function_tables, signature_tables);
|
| + isolate_, shared, code_table, *function_tables, *signature_tables);
|
|
|
| // If we created a wasm script, finish it now and make it public to the
|
| // debugger.
|
| @@ -649,7 +681,7 @@ class CompilationHelper {
|
| int export_index =
|
| static_cast<int>(module->functions.size() + func_index);
|
| code_table->set(export_index, *wrapper_code);
|
| - RecordStats(isolate_, *wrapper_code);
|
| + RecordStats(isolate_, *wrapper_code, is_sync_);
|
| func_index++;
|
| }
|
|
|
| @@ -1139,7 +1171,7 @@ class InstantiationHelper {
|
| UNREACHABLE();
|
| }
|
| }
|
| - RecordStats(isolate_, code_table);
|
| + RecordStats(isolate_, code_table, is_sync_);
|
| } else {
|
| // There was no owner, so we can reuse the original.
|
| compiled_module_ = original;
|
| @@ -1416,7 +1448,7 @@ class InstantiationHelper {
|
| Handle<WasmExportedFunction> startup_fct = WasmExportedFunction::New(
|
| isolate_, instance, MaybeHandle<String>(), start_index,
|
| static_cast<int>(sig->parameter_count()), wrapper_code);
|
| - RecordStats(isolate_, *startup_code);
|
| + RecordStats(isolate_, *startup_code, is_sync_);
|
| // Call the JS function.
|
| Handle<Object> undefined = factory->undefined_value();
|
| MaybeHandle<Object> retval =
|
| @@ -1450,6 +1482,7 @@ class InstantiationHelper {
|
|
|
| Isolate* isolate_;
|
| WasmModule* const module_;
|
| + constexpr static bool is_sync_ = true;
|
| ErrorThrower* thrower_;
|
| Handle<WasmModuleObject> module_object_;
|
| Handle<JSReceiver> ffi_; // TODO(titzer): Use MaybeHandle
|
| @@ -1621,7 +1654,7 @@ class InstantiationHelper {
|
| return -1;
|
| }
|
| code_table->set(num_imported_functions, *import_wrapper);
|
| - RecordStats(isolate_, *import_wrapper);
|
| + RecordStats(isolate_, *import_wrapper, is_sync_);
|
| num_imported_functions++;
|
| break;
|
| }
|
| @@ -2492,7 +2525,8 @@ MaybeHandle<WasmModuleObject> wasm::SyncCompileTranslatedAsmJs(
|
|
|
| // Transfer ownership to the {WasmModuleWrapper} generated in
|
| // {CompileToModuleObject}.
|
| - CompilationHelper helper(isolate, std::move(result.val));
|
| + constexpr bool is_sync = true;
|
| + CompilationHelper helper(isolate, std::move(result.val), is_sync);
|
| return helper.CompileToModuleObject(thrower, bytes, asm_js_script,
|
| asm_js_offset_table_bytes);
|
| }
|
| @@ -2514,7 +2548,8 @@ MaybeHandle<WasmModuleObject> wasm::SyncCompile(Isolate* isolate,
|
|
|
| // Transfer ownership to the {WasmModuleWrapper} generated in
|
| // {CompileToModuleObject}.
|
| - CompilationHelper helper(isolate, std::move(result.val));
|
| + constexpr bool is_sync = true;
|
| + CompilationHelper helper(isolate, std::move(result.val), is_sync);
|
| return helper.CompileToModuleObject(thrower, bytes, Handle<Script>(),
|
| Vector<const byte>());
|
| }
|
| @@ -2698,8 +2733,10 @@ class AsyncCompileJob {
|
| DisallowHeapAllocation no_allocation;
|
| // Decode the module bytes.
|
| TRACE_COMPILE("(1) Decoding module...\n");
|
| + constexpr bool is_sync = true;
|
| result = DecodeWasmModule(job_->isolate_, job_->wire_bytes_.start(),
|
| - job_->wire_bytes_.end(), false, kWasmOrigin);
|
| + job_->wire_bytes_.end(), false, kWasmOrigin,
|
| + !is_sync);
|
| }
|
| if (result.failed()) {
|
| // Decoding failure; reject the promise and clean up.
|
| @@ -2792,8 +2829,9 @@ class AsyncCompileJob {
|
| // Transfer ownership of the {WasmModule} to the {CompilationHelper}, but
|
| // keep a pointer.
|
| WasmModule* module = module_.get();
|
| + constexpr bool is_sync = true;
|
| job_->helper_.reset(
|
| - new CompilationHelper(job_->isolate_, std::move(module_)));
|
| + new CompilationHelper(job_->isolate_, std::move(module_), !is_sync));
|
|
|
| DCHECK_LE(module->num_imported_functions, module->functions.size());
|
| size_t num_functions =
|
| @@ -2934,10 +2972,11 @@ class AsyncCompileJob {
|
| TRACE_COMPILE("(5b) Finish compile...\n");
|
| HandleScope scope(job_->isolate_);
|
| // At this point, compilation has completed. Update the code table.
|
| + constexpr bool is_sync = true;
|
| for (size_t i = FLAG_skip_compiling_wasm_funcs;
|
| i < job_->temp_instance_->function_code.size(); ++i) {
|
| Code* code = Code::cast(job_->code_table_->get(static_cast<int>(i)));
|
| - RecordStats(job_->isolate_, code);
|
| + RecordStats(job_->isolate_, code, !is_sync);
|
| }
|
|
|
| // Create heap objects for script and module bytes to be stored in the
|
| @@ -3003,6 +3042,7 @@ class AsyncCompileJob {
|
| HandleScope scope(job_->isolate_);
|
| JSToWasmWrapperCache js_to_wasm_cache;
|
| int func_index = 0;
|
| + constexpr bool is_sync = true;
|
| WasmModule* module = job_->compiled_module_->module();
|
| for (auto exp : module->export_table) {
|
| if (exp.kind != kExternalFunction) continue;
|
| @@ -3014,7 +3054,7 @@ class AsyncCompileJob {
|
| int export_index =
|
| static_cast<int>(module->functions.size() + func_index);
|
| job_->code_table_->set(export_index, *wrapper_code);
|
| - RecordStats(job_->isolate_, *wrapper_code);
|
| + RecordStats(job_->isolate_, *wrapper_code, !is_sync);
|
| func_index++;
|
| }
|
|
|
|
|