| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "src/assembler-inl.h" | 7 #include "src/assembler-inl.h" |
| 8 #include "src/base/adapters.h" | 8 #include "src/base/adapters.h" |
| 9 #include "src/base/atomic-utils.h" | 9 #include "src/base/atomic-utils.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 DisallowHandleDereference no_deref; | 239 DisallowHandleDereference no_deref; |
| 240 DisallowCodeDependencyChange no_dependency_change; | 240 DisallowCodeDependencyChange no_dependency_change; |
| 241 | 241 |
| 242 // - 1 because AtomicIncrement returns the value after the atomic increment. | 242 // - 1 because AtomicIncrement returns the value after the atomic increment. |
| 243 size_t index = next_unit_.Increment(1) - 1; | 243 size_t index = next_unit_.Increment(1) - 1; |
| 244 if (index >= compilation_units_.size()) { | 244 if (index >= compilation_units_.size()) { |
| 245 return false; | 245 return false; |
| 246 } | 246 } |
| 247 | 247 |
| 248 compiler::WasmCompilationUnit* unit = compilation_units_.at(index); | 248 compiler::WasmCompilationUnit* unit = compilation_units_.at(index); |
| 249 if (unit != nullptr) { | 249 unit->ExecuteCompilation(); |
| 250 unit->ExecuteCompilation(); | 250 base::LockGuard<base::Mutex> guard(&result_mutex_); |
| 251 base::LockGuard<base::Mutex> guard(&result_mutex_); | 251 executed_units_.push(unit); |
| 252 executed_units_.push(unit); | |
| 253 } | |
| 254 return true; | 252 return true; |
| 255 } | 253 } |
| 256 | 254 |
| 257 void InitializeParallelCompilation(const std::vector<WasmFunction>& functions, | 255 void InitializeParallelCompilation(const std::vector<WasmFunction>& functions, |
| 258 ModuleBytesEnv& module_env, | 256 ModuleBytesEnv& module_env, |
| 259 ErrorThrower* thrower) { | 257 ErrorThrower* thrower) { |
| 260 compilation_units_.reserve(functions.size()); | 258 uint32_t start = module_env.module_env.module->num_imported_functions + |
| 261 for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size(); | 259 FLAG_skip_compiling_wasm_funcs; |
| 262 ++i) { | 260 uint32_t num_funcs = static_cast<uint32_t>(functions.size()); |
| 261 uint32_t funcs_to_compile = start > num_funcs ? 0 : num_funcs - start; |
| 262 compilation_units_.reserve(funcs_to_compile); |
| 263 for (uint32_t i = start; i < num_funcs; ++i) { |
| 263 const WasmFunction* func = &functions[i]; | 264 const WasmFunction* func = &functions[i]; |
| 264 compilation_units_.push_back( | 265 compilation_units_.push_back(new compiler::WasmCompilationUnit( |
| 265 func->imported ? nullptr | 266 thrower, isolate_, &module_env, func, i)); |
| 266 : new compiler::WasmCompilationUnit( | |
| 267 thrower, isolate_, &module_env, func, i)); | |
| 268 } | 267 } |
| 269 } | 268 } |
| 270 | 269 |
| 271 uint32_t* StartCompilationTasks() { | 270 uint32_t* StartCompilationTasks() { |
| 272 const size_t num_tasks = | 271 const size_t num_tasks = |
| 273 Min(static_cast<size_t>(FLAG_wasm_num_compilation_tasks), | 272 Min(static_cast<size_t>(FLAG_wasm_num_compilation_tasks), |
| 274 V8::GetCurrentPlatform()->NumberOfAvailableBackgroundThreads()); | 273 V8::GetCurrentPlatform()->NumberOfAvailableBackgroundThreads()); |
| 275 uint32_t* task_ids = new uint32_t[num_tasks]; | 274 uint32_t* task_ids = new uint32_t[num_tasks]; |
| 276 for (size_t i = 0; i < num_tasks; ++i) { | 275 for (size_t i = 0; i < num_tasks; ++i) { |
| 277 CompilationTask* task = new CompilationTask(this); | 276 CompilationTask* task = new CompilationTask(this); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 // patched at instantiation. | 441 // patched at instantiation. |
| 443 Handle<Code> illegal_builtin = isolate_->builtins()->Illegal(); | 442 Handle<Code> illegal_builtin = isolate_->builtins()->Illegal(); |
| 444 for (uint32_t i = 0; i < module_->functions.size(); ++i) { | 443 for (uint32_t i = 0; i < module_->functions.size(); ++i) { |
| 445 code_table->set(static_cast<int>(i), *illegal_builtin); | 444 code_table->set(static_cast<int>(i), *illegal_builtin); |
| 446 temp_instance.function_code[i] = illegal_builtin; | 445 temp_instance.function_code[i] = illegal_builtin; |
| 447 } | 446 } |
| 448 | 447 |
| 449 isolate_->counters()->wasm_functions_per_module()->AddSample( | 448 isolate_->counters()->wasm_functions_per_module()->AddSample( |
| 450 static_cast<int>(module_->functions.size())); | 449 static_cast<int>(module_->functions.size())); |
| 451 CompilationHelper helper(isolate_, module_); | 450 CompilationHelper helper(isolate_, module_); |
| 452 if (!FLAG_trace_wasm_decoder && FLAG_wasm_num_compilation_tasks != 0) { | 451 size_t funcs_to_compile = |
| 452 module_->functions.size() - module_->num_imported_functions; |
| 453 if (!FLAG_trace_wasm_decoder && FLAG_wasm_num_compilation_tasks != 0 && |
| 454 funcs_to_compile > 1) { |
| 453 // Avoid a race condition by collecting results into a second vector. | 455 // Avoid a race condition by collecting results into a second vector. |
| 454 std::vector<Handle<Code>> results(temp_instance.function_code); | 456 std::vector<Handle<Code>> results(temp_instance.function_code); |
| 455 helper.CompileInParallel(&module_env, results, thrower); | 457 helper.CompileInParallel(&module_env, results, thrower); |
| 456 temp_instance.function_code.swap(results); | 458 temp_instance.function_code.swap(results); |
| 457 } else { | 459 } else { |
| 458 helper.CompileSequentially(&module_env, temp_instance.function_code, | 460 helper.CompileSequentially(&module_env, temp_instance.function_code, |
| 459 thrower); | 461 thrower); |
| 460 } | 462 } |
| 461 if (thrower->error()) return {}; | 463 if (thrower->error()) return {}; |
| 462 | 464 |
| (...skipping 2245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2708 Handle<String> module_property_name = | 2710 Handle<String> module_property_name = |
| 2709 isolate->factory()->InternalizeUtf8String("module"); | 2711 isolate->factory()->InternalizeUtf8String("module"); |
| 2710 Handle<String> instance_property_name = | 2712 Handle<String> instance_property_name = |
| 2711 isolate->factory()->InternalizeUtf8String("instance"); | 2713 isolate->factory()->InternalizeUtf8String("instance"); |
| 2712 JSObject::AddProperty(ret, module_property_name, module, NONE); | 2714 JSObject::AddProperty(ret, module_property_name, module, NONE); |
| 2713 JSObject::AddProperty(ret, instance_property_name, | 2715 JSObject::AddProperty(ret, instance_property_name, |
| 2714 instance_object.ToHandleChecked(), NONE); | 2716 instance_object.ToHandleChecked(), NONE); |
| 2715 | 2717 |
| 2716 ResolvePromise(isolate, promise, ret); | 2718 ResolvePromise(isolate, promise, ret); |
| 2717 } | 2719 } |
| OLD | NEW |