Index: src/wasm/wasm-module.cc |
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc |
index 0a404568b09db96443d43785a51f57f2fd8a2b90..fe72705a76424fdc3666e9e9f75a8a7446bf276f 100644 |
--- a/src/wasm/wasm-module.cc |
+++ b/src/wasm/wasm-module.cc |
@@ -56,22 +56,15 @@ byte* raw_buffer_ptr(MaybeHandle<JSArrayBuffer> buffer, int offset) { |
return static_cast<byte*>(buffer.ToHandleChecked()->backing_store()) + offset; |
} |
-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(Code* code, Counters* counters) { |
+ counters->wasm_generated_code_size()->Increment(code->body_size()); |
+ counters->wasm_reloc_size()->Increment(code->relocation_info()->length()); |
} |
-static void RecordStats(Isolate* isolate, Handle<FixedArray> functions, |
- bool is_sync) { |
+static void RecordStats(Handle<FixedArray> functions, Counters* counters) { |
DisallowHeapAllocation no_gc; |
for (int i = 0; i < functions->length(); ++i) { |
- RecordStats(isolate, Code::cast(functions->get(i)), is_sync); |
+ RecordStats(Code::cast(functions->get(i)), counters); |
} |
} |
@@ -338,8 +331,11 @@ class CompilationHelper { |
bool is_sync) |
: isolate_(isolate), |
module_(std::move(module)), |
+ counters_shared_(isolate->counters_shared()), |
is_sync_(is_sync), |
- executed_units_(isolate->random_number_generator()) {} |
+ executed_units_(isolate->random_number_generator()) { |
+ counters_ = counters_shared_.get(); |
+ } |
// The actual runnable task that performs compilations in the background. |
class CompilationTask : public CancelableTask { |
@@ -357,6 +353,8 @@ class CompilationHelper { |
Isolate* isolate_; |
std::unique_ptr<WasmModule> module_; |
+ std::shared_ptr<Counters> counters_shared_; |
+ Counters* counters_; |
Clemens Hammacher
2017/06/02 13:08:50
Why is this field needed? {counters_shared_.get()}
kschimpf
2017/06/02 15:01:02
I was confusing the assignment operator with the g
kschimpf
2017/06/02 17:06:27
Fixed in CL https://codereview.chromium.org/291995
|
bool is_sync_; |
std::vector<std::unique_ptr<compiler::WasmCompilationUnit>> |
compilation_units_; |
@@ -690,7 +688,7 @@ class CompilationHelper { |
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, is_sync_); |
+ RecordStats(code, counters_); |
} |
// Create heap objects for script, module bytes and asm.js offset table to |
@@ -758,7 +756,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, is_sync_); |
+ RecordStats(*wrapper_code, counters_); |
func_index++; |
} |
@@ -912,11 +910,10 @@ int ExtractDirectCallIndex(wasm::Decoder& decoder, const byte* pc) { |
return static_cast<int>(call_idx); |
} |
-void RecordLazyCodeStats(Isolate* isolate, Code* code) { |
- isolate->counters()->wasm_lazily_compiled_functions()->Increment(); |
- isolate->counters()->wasm_generated_code_size()->Increment(code->body_size()); |
- isolate->counters()->wasm_reloc_size()->Increment( |
- code->relocation_info()->length()); |
+void RecordLazyCodeStats(Code* code, Counters* counters) { |
+ counters->wasm_lazily_compiled_functions()->Increment(); |
+ counters->wasm_generated_code_size()->Increment(code->body_size()); |
+ counters->wasm_reloc_size()->Increment(code->relocation_info()->length()); |
} |
} // namespace |
@@ -1151,12 +1148,15 @@ class InstantiationHelper { |
MaybeHandle<JSArrayBuffer> memory) |
: isolate_(isolate), |
module_(module_object->compiled_module()->module()), |
+ counters_shared_(isolate->counters_shared()), |
thrower_(thrower), |
module_object_(module_object), |
ffi_(ffi.is_null() ? Handle<JSReceiver>::null() |
: ffi.ToHandleChecked()), |
memory_(memory.is_null() ? Handle<JSArrayBuffer>::null() |
- : memory.ToHandleChecked()) {} |
+ : memory.ToHandleChecked()) { |
+ counters_ = counters_shared_.get(); |
+ } |
// Build an instance, in all of its glory. |
MaybeHandle<WasmInstanceObject> Build() { |
@@ -1246,7 +1246,7 @@ class InstantiationHelper { |
UNREACHABLE(); |
} |
} |
- RecordStats(isolate_, code_table, is_sync_); |
+ RecordStats(code_table, counters_); |
} else { |
// There was no owner, so we can reuse the original. |
compiled_module_ = original; |
@@ -1523,7 +1523,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, is_sync_); |
+ RecordStats(*startup_code, counters_); |
// Call the JS function. |
Handle<Object> undefined = factory->undefined_value(); |
MaybeHandle<Object> retval = |
@@ -1557,7 +1557,8 @@ class InstantiationHelper { |
Isolate* isolate_; |
WasmModule* const module_; |
- constexpr static bool is_sync_ = true; |
+ std::shared_ptr<Counters> counters_shared_; |
+ Counters* counters_; |
Clemens Hammacher
2017/06/02 13:08:50
Same here.
kschimpf
2017/06/02 17:06:28
Fixed in CL https://codereview.chromium.org/291995
|
ErrorThrower* thrower_; |
Handle<WasmModuleObject> module_object_; |
Handle<JSReceiver> ffi_; // TODO(titzer): Use MaybeHandle |
@@ -1767,7 +1768,7 @@ class InstantiationHelper { |
return -1; |
} |
code_table->set(num_imported_functions, *import_wrapper); |
- RecordStats(isolate_, *import_wrapper, is_sync_); |
+ RecordStats(*import_wrapper, counters_); |
num_imported_functions++; |
break; |
} |
@@ -2740,6 +2741,7 @@ class AsyncCompileJob { |
size_t length, Handle<Context> context, |
Handle<JSPromise> promise) |
: isolate_(isolate), |
+ counters_shared_(isolate->counters_shared()), |
bytes_copy_(std::move(bytes_copy)), |
wire_bytes_(bytes_copy_.get(), bytes_copy_.get() + length) { |
// The handles for the context and promise must be deferred. |
@@ -2747,6 +2749,7 @@ class AsyncCompileJob { |
context_ = Handle<Context>(*context); |
module_promise_ = Handle<JSPromise>(*promise); |
deferred_handles_.push_back(deferred.Detach()); |
+ counters_ = counters_shared_.get(); |
} |
void Start() { |
@@ -2759,6 +2762,8 @@ class AsyncCompileJob { |
private: |
Isolate* isolate_; |
+ std::shared_ptr<Counters> counters_shared_; |
+ Counters* counters_; |
std::unique_ptr<byte[]> bytes_copy_; |
ModuleWireBytes wire_bytes_; |
Handle<Context> context_; |
@@ -3125,11 +3130,10 @@ 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, !is_sync); |
+ RecordStats(code, job_->counters_); |
} |
// Create heap objects for script and module bytes to be stored in the |
@@ -3195,7 +3199,6 @@ 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; |
@@ -3207,7 +3210,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, !is_sync); |
+ RecordStats(*wrapper_code, job_->counters_); |
func_index++; |
} |
@@ -3331,7 +3334,8 @@ Handle<Code> wasm::CompileLazy(Isolate* isolate) { |
} |
void LazyCompilationOrchestrator::CompileFunction( |
- Isolate* isolate, Handle<WasmInstanceObject> instance, int func_index) { |
+ Isolate* isolate, Handle<WasmInstanceObject> instance, int func_index, |
+ Counters* counters) { |
Handle<WasmCompiledModule> compiled_module(instance->compiled_module(), |
isolate); |
if (Code::cast(compiled_module->code_table()->get(func_index))->kind() == |
@@ -3419,7 +3423,7 @@ void LazyCompilationOrchestrator::CompileFunction( |
code_specialization.ApplyToWasmCode(*code, SKIP_ICACHE_FLUSH); |
Assembler::FlushICache(isolate, code->instruction_start(), |
code->instruction_size()); |
- RecordLazyCodeStats(isolate, *code); |
+ RecordLazyCodeStats(*code, counters); |
} |
Handle<Code> LazyCompilationOrchestrator::CompileLazy( |
@@ -3429,6 +3433,8 @@ Handle<Code> LazyCompilationOrchestrator::CompileLazy( |
int offset; |
int func_index; |
}; |
+ std::shared_ptr<Counters> counters_shared = isolate->counters_shared(); |
+ Counters* counters = counters_shared.get(); |
std::vector<NonCompiledFunction> non_compiled_functions; |
int func_to_return_idx = exported_func_index; |
wasm::Decoder decoder(nullptr, nullptr); |
@@ -3473,7 +3479,7 @@ Handle<Code> LazyCompilationOrchestrator::CompileLazy( |
// TODO(clemensh): compile all functions in non_compiled_functions in |
// background, wait for func_to_return_idx. |
- CompileFunction(isolate, instance, func_to_return_idx); |
+ CompileFunction(isolate, instance, func_to_return_idx, counters); |
if (is_js_to_wasm || patch_caller) { |
DisallowHeapAllocation no_gc; |