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

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

Issue 2864583004: Only turn on UMA WASM metric when synchronous. (Closed)
Patch Set: Again, merge updated master. Created 3 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/module-decoder.cc ('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 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++;
}
« no previous file with comments | « src/wasm/module-decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698