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 "src/base/atomic-utils.h" | 5 #include "src/base/atomic-utils.h" |
6 #include "src/macro-assembler.h" | 6 #include "src/macro-assembler.h" |
7 #include "src/objects.h" | 7 #include "src/objects.h" |
8 #include "src/property-descriptor.h" | 8 #include "src/property-descriptor.h" |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 WasmModule::WasmModule() | 341 WasmModule::WasmModule() |
342 : module_start(nullptr), | 342 : module_start(nullptr), |
343 module_end(nullptr), | 343 module_end(nullptr), |
344 min_mem_pages(0), | 344 min_mem_pages(0), |
345 max_mem_pages(0), | 345 max_mem_pages(0), |
346 mem_export(false), | 346 mem_export(false), |
347 mem_external(false), | 347 mem_external(false), |
348 start_function_index(-1), | 348 start_function_index(-1), |
349 origin(kWasmOrigin), | 349 origin(kWasmOrigin), |
350 globals_size(0), | 350 globals_size(0), |
351 indirect_table_size(0) {} | 351 indirect_table_size(0), |
| 352 pending_tasks(new base::Semaphore(0)) {} |
352 | 353 |
353 static MaybeHandle<JSFunction> ReportFFIError(ErrorThrower& thrower, | 354 static MaybeHandle<JSFunction> ReportFFIError(ErrorThrower& thrower, |
354 const char* error, uint32_t index, | 355 const char* error, uint32_t index, |
355 wasm::WasmName module_name, | 356 wasm::WasmName module_name, |
356 wasm::WasmName function_name) { | 357 wasm::WasmName function_name) { |
357 if (!function_name.is_empty()) { | 358 if (!function_name.is_empty()) { |
358 thrower.Error("Import #%d module=\"%.*s\" function=\"%.*s\" error: %s", | 359 thrower.Error("Import #%d module=\"%.*s\" function=\"%.*s\" error: %s", |
359 index, module_name.length(), module_name.start(), | 360 index, module_name.length(), module_name.start(), |
360 function_name.length(), function_name.start(), error); | 361 function_name.length(), function_name.start(), error); |
361 } else { | 362 } else { |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 // Turn on the {CanonicalHandleScope} so that the background threads can | 608 // Turn on the {CanonicalHandleScope} so that the background threads can |
608 // use the node cache. | 609 // use the node cache. |
609 CanonicalHandleScope canonical(isolate); | 610 CanonicalHandleScope canonical(isolate); |
610 | 611 |
611 // 1) The main thread allocates a compilation unit for each wasm function | 612 // 1) The main thread allocates a compilation unit for each wasm function |
612 // and stores them in the vector {compilation_units}. | 613 // and stores them in the vector {compilation_units}. |
613 InitializeParallelCompilation(isolate, module->functions, compilation_units, | 614 InitializeParallelCompilation(isolate, module->functions, compilation_units, |
614 *module_env, *thrower); | 615 *module_env, *thrower); |
615 | 616 |
616 // Objects for the synchronization with the background threads. | 617 // Objects for the synchronization with the background threads. |
617 base::SmartPointer<base::Semaphore> pending_tasks(new base::Semaphore(0)); | |
618 base::Mutex result_mutex; | 618 base::Mutex result_mutex; |
619 base::AtomicNumber<size_t> next_unit( | 619 base::AtomicNumber<size_t> next_unit( |
620 static_cast<size_t>(FLAG_skip_compiling_wasm_funcs)); | 620 static_cast<size_t>(FLAG_skip_compiling_wasm_funcs)); |
621 | 621 |
622 // 2) The main thread spawns {WasmCompilationTask} instances which run on | 622 // 2) The main thread spawns {WasmCompilationTask} instances which run on |
623 // the background threads. | 623 // the background threads. |
624 base::SmartArrayPointer<uint32_t> task_ids( | 624 base::SmartArrayPointer<uint32_t> task_ids(StartCompilationTasks( |
625 StartCompilationTasks(isolate, compilation_units, executed_units, | 625 isolate, compilation_units, executed_units, module->pending_tasks.get(), |
626 pending_tasks.get(), result_mutex, next_unit)); | 626 result_mutex, next_unit)); |
627 | 627 |
628 // 3.a) The background threads and the main thread pick one compilation | 628 // 3.a) The background threads and the main thread pick one compilation |
629 // unit at a time and execute the parallel phase of the compilation | 629 // unit at a time and execute the parallel phase of the compilation |
630 // unit. After finishing the execution of the parallel phase, the | 630 // unit. After finishing the execution of the parallel phase, the |
631 // result is enqueued in {executed_units}. | 631 // result is enqueued in {executed_units}. |
632 while (FetchAndExecuteCompilationUnit(isolate, &compilation_units, | 632 while (FetchAndExecuteCompilationUnit(isolate, &compilation_units, |
633 &executed_units, &result_mutex, | 633 &executed_units, &result_mutex, |
634 &next_unit)) { | 634 &next_unit)) { |
635 // 3.b) If {executed_units} contains a compilation unit, the main thread | 635 // 3.b) If {executed_units} contains a compilation unit, the main thread |
636 // dequeues it and finishes the compilation unit. Compilation units | 636 // dequeues it and finishes the compilation unit. Compilation units |
637 // are finished concurrently to the background threads to save | 637 // are finished concurrently to the background threads to save |
638 // memory. | 638 // memory. |
639 FinishCompilationUnits(executed_units, functions, result_mutex); | 639 FinishCompilationUnits(executed_units, functions, result_mutex); |
640 } | 640 } |
641 // 4) After the parallel phase of all compilation units has started, the | 641 // 4) After the parallel phase of all compilation units has started, the |
642 // main thread waits for all {WasmCompilationTask} instances to finish. | 642 // main thread waits for all {WasmCompilationTask} instances to finish. |
643 WaitForCompilationTasks(isolate, task_ids.get(), pending_tasks.get()); | 643 WaitForCompilationTasks(isolate, task_ids.get(), module->pending_tasks.get()); |
644 // Finish the compilation of the remaining compilation units. | 644 // Finish the compilation of the remaining compilation units. |
645 FinishCompilationUnits(executed_units, functions, result_mutex); | 645 FinishCompilationUnits(executed_units, functions, result_mutex); |
646 } | 646 } |
647 | 647 |
648 void CompileSequentially(Isolate* isolate, const WasmModule* module, | 648 void CompileSequentially(Isolate* isolate, const WasmModule* module, |
649 std::vector<Handle<Code>>& functions, | 649 std::vector<Handle<Code>>& functions, |
650 ErrorThrower* thrower, ModuleEnv* module_env) { | 650 ErrorThrower* thrower, ModuleEnv* module_env) { |
651 DCHECK(!thrower->error()); | 651 DCHECK(!thrower->error()); |
652 | 652 |
653 for (uint32_t i = FLAG_skip_compiling_wasm_funcs; | 653 for (uint32_t i = FLAG_skip_compiling_wasm_funcs; |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1122 Object* info = wasm->GetInternalField(kWasmDebugInfo); | 1122 Object* info = wasm->GetInternalField(kWasmDebugInfo); |
1123 if (!info->IsUndefined(wasm->GetIsolate())) return WasmDebugInfo::cast(info); | 1123 if (!info->IsUndefined(wasm->GetIsolate())) return WasmDebugInfo::cast(info); |
1124 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(handle(wasm)); | 1124 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(handle(wasm)); |
1125 wasm->SetInternalField(kWasmDebugInfo, *new_info); | 1125 wasm->SetInternalField(kWasmDebugInfo, *new_info); |
1126 return *new_info; | 1126 return *new_info; |
1127 } | 1127 } |
1128 | 1128 |
1129 } // namespace wasm | 1129 } // namespace wasm |
1130 } // namespace internal | 1130 } // namespace internal |
1131 } // namespace v8 | 1131 } // namespace v8 |
OLD | NEW |