| 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/compiler/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 | 10 |
| (...skipping 3668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3679 if (FLAG_trace_wasm_decode_time) { | 3679 if (FLAG_trace_wasm_decode_time) { |
| 3680 decode_timer.Start(); | 3680 decode_timer.Start(); |
| 3681 } | 3681 } |
| 3682 // Create a TF graph during decoding. | 3682 // Create a TF graph during decoding. |
| 3683 | 3683 |
| 3684 Graph* graph = jsgraph_->graph(); | 3684 Graph* graph = jsgraph_->graph(); |
| 3685 CommonOperatorBuilder* common = jsgraph_->common(); | 3685 CommonOperatorBuilder* common = jsgraph_->common(); |
| 3686 MachineOperatorBuilder* machine = jsgraph_->machine(); | 3686 MachineOperatorBuilder* machine = jsgraph_->machine(); |
| 3687 SourcePositionTable* source_position_table = | 3687 SourcePositionTable* source_position_table = |
| 3688 new (jsgraph_->zone()) SourcePositionTable(graph); | 3688 new (jsgraph_->zone()) SourcePositionTable(graph); |
| 3689 WasmGraphBuilder builder(module_env_, jsgraph_->zone(), jsgraph_, | 3689 WasmGraphBuilder builder(&module_env_->module_env, jsgraph_->zone(), jsgraph_, |
| 3690 function_->sig, source_position_table); | 3690 function_->sig, source_position_table); |
| 3691 const byte* module_start = module_env_->module_bytes.start(); | 3691 const byte* module_start = module_env_->wire_bytes.start(); |
| 3692 wasm::FunctionBody body = {function_->sig, module_start, | 3692 wasm::FunctionBody body = {function_->sig, module_start, |
| 3693 module_start + function_->code_start_offset, | 3693 module_start + function_->code_start_offset, |
| 3694 module_start + function_->code_end_offset}; | 3694 module_start + function_->code_end_offset}; |
| 3695 graph_construction_result_ = | 3695 graph_construction_result_ = |
| 3696 wasm::BuildTFGraph(isolate_->allocator(), &builder, body); | 3696 wasm::BuildTFGraph(isolate_->allocator(), &builder, body); |
| 3697 | 3697 |
| 3698 if (graph_construction_result_.failed()) { | 3698 if (graph_construction_result_.failed()) { |
| 3699 if (FLAG_trace_wasm_compiler) { | 3699 if (FLAG_trace_wasm_compiler) { |
| 3700 OFStream os(stdout); | 3700 OFStream os(stdout); |
| 3701 os << "Compilation failed: " << graph_construction_result_ << std::endl; | 3701 os << "Compilation failed: " << graph_construction_result_ << std::endl; |
| 3702 } | 3702 } |
| 3703 return nullptr; | 3703 return nullptr; |
| 3704 } | 3704 } |
| 3705 | 3705 |
| 3706 if (machine->Is32()) { | 3706 if (machine->Is32()) { |
| 3707 Int64Lowering(graph, machine, common, jsgraph_->zone(), function_->sig) | 3707 Int64Lowering(graph, machine, common, jsgraph_->zone(), function_->sig) |
| 3708 .LowerGraph(); | 3708 .LowerGraph(); |
| 3709 } | 3709 } |
| 3710 | 3710 |
| 3711 if (builder.has_simd() && !CpuFeatures::SupportsSimd128()) { | 3711 if (builder.has_simd() && !CpuFeatures::SupportsSimd128()) { |
| 3712 SimdScalarLowering(graph, machine, common, jsgraph_->zone(), function_->sig) | 3712 SimdScalarLowering(graph, machine, common, jsgraph_->zone(), function_->sig) |
| 3713 .LowerGraph(); | 3713 .LowerGraph(); |
| 3714 } | 3714 } |
| 3715 | 3715 |
| 3716 int index = static_cast<int>(function_->func_index); | 3716 int index = static_cast<int>(function_->func_index); |
| 3717 | 3717 |
| 3718 if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) { | 3718 if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) { |
| 3719 OFStream os(stdout); | 3719 OFStream os(stdout); |
| 3720 PrintWasmCode(isolate_->allocator(), body, module_env_->module, os, | 3720 PrintWasmCode(isolate_->allocator(), body, module_env_->module_env.module, |
| 3721 nullptr); | 3721 os, nullptr); |
| 3722 } | 3722 } |
| 3723 if (index >= FLAG_trace_wasm_text_start && index < FLAG_trace_wasm_text_end) { | 3723 if (index >= FLAG_trace_wasm_text_start && index < FLAG_trace_wasm_text_end) { |
| 3724 OFStream os(stdout); | 3724 OFStream os(stdout); |
| 3725 PrintWasmText(module_env_->module, *module_env_, function_->func_index, os, | 3725 PrintWasmText(module_env_->module_env.module, module_env_->wire_bytes, |
| 3726 nullptr); | 3726 function_->func_index, os, nullptr); |
| 3727 } | 3727 } |
| 3728 if (FLAG_trace_wasm_decode_time) { | 3728 if (FLAG_trace_wasm_decode_time) { |
| 3729 *decode_ms = decode_timer.Elapsed().InMillisecondsF(); | 3729 *decode_ms = decode_timer.Elapsed().InMillisecondsF(); |
| 3730 } | 3730 } |
| 3731 return source_position_table; | 3731 return source_position_table; |
| 3732 } | 3732 } |
| 3733 | 3733 |
| 3734 WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower, | 3734 WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower, |
| 3735 Isolate* isolate, | 3735 Isolate* isolate, |
| 3736 wasm::ModuleBytesEnv* module_env, | 3736 wasm::ModuleBytesEnv* module_env, |
| 3737 const wasm::WasmFunction* function, | 3737 const wasm::WasmFunction* function, |
| 3738 uint32_t index) | 3738 uint32_t index) |
| 3739 : thrower_(thrower), | 3739 : thrower_(thrower), |
| 3740 isolate_(isolate), | 3740 isolate_(isolate), |
| 3741 module_env_(module_env), | 3741 module_env_(module_env), |
| 3742 function_(&module_env->module->functions[index]), | 3742 function_(&module_env->module_env.module->functions[index]), |
| 3743 graph_zone_(new Zone(isolate->allocator(), ZONE_NAME)), | 3743 graph_zone_(new Zone(isolate->allocator(), ZONE_NAME)), |
| 3744 jsgraph_(new (graph_zone()) JSGraph( | 3744 jsgraph_(new (graph_zone()) JSGraph( |
| 3745 isolate, new (graph_zone()) Graph(graph_zone()), | 3745 isolate, new (graph_zone()) Graph(graph_zone()), |
| 3746 new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr, | 3746 new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr, |
| 3747 nullptr, new (graph_zone()) MachineOperatorBuilder( | 3747 nullptr, new (graph_zone()) MachineOperatorBuilder( |
| 3748 graph_zone(), MachineType::PointerRepresentation(), | 3748 graph_zone(), MachineType::PointerRepresentation(), |
| 3749 InstructionSelector::SupportedMachineOperatorFlags(), | 3749 InstructionSelector::SupportedMachineOperatorFlags(), |
| 3750 InstructionSelector::AlignmentRequirements()))), | 3750 InstructionSelector::AlignmentRequirements()))), |
| 3751 compilation_zone_(isolate->allocator(), ZONE_NAME), | 3751 compilation_zone_(isolate->allocator(), ZONE_NAME), |
| 3752 info_(function->name_length != 0 ? module_env->GetNameOrNull(function) | 3752 info_(function->name_length != 0 |
| 3753 : ArrayVector("wasm"), | 3753 ? module_env->wire_bytes.GetNameOrNull(function) |
| 3754 : ArrayVector("wasm"), |
| 3754 isolate, &compilation_zone_, | 3755 isolate, &compilation_zone_, |
| 3755 Code::ComputeFlags(Code::WASM_FUNCTION)), | 3756 Code::ComputeFlags(Code::WASM_FUNCTION)), |
| 3756 job_(), | 3757 job_(), |
| 3757 index_(index), | 3758 index_(index), |
| 3758 ok_(true), | 3759 ok_(true), |
| 3759 protected_instructions_(&compilation_zone_) { | 3760 protected_instructions_(&compilation_zone_) { |
| 3760 // Create and cache this node in the main thread. | 3761 // Create and cache this node in the main thread. |
| 3761 jsgraph_->CEntryStubConstant(1); | 3762 jsgraph_->CEntryStubConstant(1); |
| 3762 } | 3763 } |
| 3763 | 3764 |
| 3764 void WasmCompilationUnit::ExecuteCompilation() { | 3765 void WasmCompilationUnit::ExecuteCompilation() { |
| 3765 // TODO(ahaas): The counters are not thread-safe at the moment. | 3766 // TODO(ahaas): The counters are not thread-safe at the moment. |
| 3766 // HistogramTimerScope wasm_compile_function_time_scope( | 3767 // HistogramTimerScope wasm_compile_function_time_scope( |
| 3767 // isolate_->counters()->wasm_compile_function_time()); | 3768 // isolate_->counters()->wasm_compile_function_time()); |
| 3768 if (FLAG_trace_wasm_compiler) { | 3769 if (FLAG_trace_wasm_compiler) { |
| 3769 OFStream os(stdout); | 3770 OFStream os(stdout); |
| 3770 os << "Compiling WASM function " | 3771 os << "Compiling WASM function " |
| 3771 << wasm::WasmFunctionName(function_, module_env_) << std::endl; | 3772 << wasm::WasmFunctionName( |
| 3773 function_, module_env_->wire_bytes.GetNameOrNull(function_)) |
| 3774 << std::endl; |
| 3772 os << std::endl; | 3775 os << std::endl; |
| 3773 } | 3776 } |
| 3774 | 3777 |
| 3775 double decode_ms = 0; | 3778 double decode_ms = 0; |
| 3776 size_t node_count = 0; | 3779 size_t node_count = 0; |
| 3777 | 3780 |
| 3778 std::unique_ptr<Zone> graph_zone(graph_zone_.release()); | 3781 std::unique_ptr<Zone> graph_zone(graph_zone_.release()); |
| 3779 SourcePositionTable* source_positions = BuildGraphForWasmFunction(&decode_ms); | 3782 SourcePositionTable* source_positions = BuildGraphForWasmFunction(&decode_ms); |
| 3780 | 3783 |
| 3781 if (graph_construction_result_.failed()) { | 3784 if (graph_construction_result_.failed()) { |
| 3782 ok_ = false; | 3785 ok_ = false; |
| 3783 return; | 3786 return; |
| 3784 } | 3787 } |
| 3785 | 3788 |
| 3786 base::ElapsedTimer pipeline_timer; | 3789 base::ElapsedTimer pipeline_timer; |
| 3787 if (FLAG_trace_wasm_decode_time) { | 3790 if (FLAG_trace_wasm_decode_time) { |
| 3788 node_count = jsgraph_->graph()->NodeCount(); | 3791 node_count = jsgraph_->graph()->NodeCount(); |
| 3789 pipeline_timer.Start(); | 3792 pipeline_timer.Start(); |
| 3790 } | 3793 } |
| 3791 | 3794 |
| 3792 // Run the compiler pipeline to generate machine code. | 3795 // Run the compiler pipeline to generate machine code. |
| 3793 CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor( | 3796 CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor( |
| 3794 &compilation_zone_, function_->sig); | 3797 &compilation_zone_, function_->sig); |
| 3795 if (jsgraph_->machine()->Is32()) { | 3798 if (jsgraph_->machine()->Is32()) { |
| 3796 descriptor = | 3799 descriptor = module_env_->module_env.GetI32WasmCallDescriptor( |
| 3797 module_env_->GetI32WasmCallDescriptor(&compilation_zone_, descriptor); | 3800 &compilation_zone_, descriptor); |
| 3798 } | 3801 } |
| 3799 job_.reset(Pipeline::NewWasmCompilationJob(&info_, jsgraph_, descriptor, | 3802 job_.reset(Pipeline::NewWasmCompilationJob(&info_, jsgraph_, descriptor, |
| 3800 source_positions, | 3803 source_positions, |
| 3801 &protected_instructions_)); | 3804 &protected_instructions_)); |
| 3802 ok_ = job_->ExecuteJob() == CompilationJob::SUCCEEDED; | 3805 ok_ = job_->ExecuteJob() == CompilationJob::SUCCEEDED; |
| 3803 // TODO(bradnelson): Improve histogram handling of size_t. | 3806 // TODO(bradnelson): Improve histogram handling of size_t. |
| 3804 // TODO(ahaas): The counters are not thread-safe at the moment. | 3807 // TODO(ahaas): The counters are not thread-safe at the moment. |
| 3805 // isolate_->counters()->wasm_compile_function_peak_memory_bytes() | 3808 // isolate_->counters()->wasm_compile_function_peak_memory_bytes() |
| 3806 // ->AddSample( | 3809 // ->AddSample( |
| 3807 // static_cast<int>(jsgraph->graph()->zone()->allocation_size())); | 3810 // static_cast<int>(jsgraph->graph()->zone()->allocation_size())); |
| 3808 | 3811 |
| 3809 if (FLAG_trace_wasm_decode_time) { | 3812 if (FLAG_trace_wasm_decode_time) { |
| 3810 double pipeline_ms = pipeline_timer.Elapsed().InMillisecondsF(); | 3813 double pipeline_ms = pipeline_timer.Elapsed().InMillisecondsF(); |
| 3811 PrintF( | 3814 PrintF( |
| 3812 "wasm-compilation phase 1 ok: %d bytes, %0.3f ms decode, %zu nodes, " | 3815 "wasm-compilation phase 1 ok: %d bytes, %0.3f ms decode, %zu nodes, " |
| 3813 "%0.3f ms pipeline\n", | 3816 "%0.3f ms pipeline\n", |
| 3814 static_cast<int>(function_->code_end_offset - | 3817 static_cast<int>(function_->code_end_offset - |
| 3815 function_->code_start_offset), | 3818 function_->code_start_offset), |
| 3816 decode_ms, node_count, pipeline_ms); | 3819 decode_ms, node_count, pipeline_ms); |
| 3817 } | 3820 } |
| 3818 } | 3821 } |
| 3819 | 3822 |
| 3820 Handle<Code> WasmCompilationUnit::FinishCompilation() { | 3823 Handle<Code> WasmCompilationUnit::FinishCompilation() { |
| 3821 if (!ok_) { | 3824 if (!ok_) { |
| 3822 if (graph_construction_result_.failed()) { | 3825 if (graph_construction_result_.failed()) { |
| 3823 // Add the function as another context for the exception | 3826 // Add the function as another context for the exception |
| 3824 ScopedVector<char> buffer(128); | 3827 ScopedVector<char> buffer(128); |
| 3825 wasm::WasmName name = module_env_->GetName(function_); | 3828 wasm::WasmName name = module_env_->wire_bytes.GetName(function_); |
| 3826 SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:", | 3829 SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:", |
| 3827 function_->func_index, name.length(), name.start()); | 3830 function_->func_index, name.length(), name.start()); |
| 3828 thrower_->CompileFailed(buffer.start(), graph_construction_result_); | 3831 thrower_->CompileFailed(buffer.start(), graph_construction_result_); |
| 3829 } | 3832 } |
| 3830 | 3833 |
| 3831 return Handle<Code>::null(); | 3834 return Handle<Code>::null(); |
| 3832 } | 3835 } |
| 3833 if (job_->FinalizeJob() != CompilationJob::SUCCEEDED) { | 3836 if (job_->FinalizeJob() != CompilationJob::SUCCEEDED) { |
| 3834 return Handle<Code>::null(); | 3837 return Handle<Code>::null(); |
| 3835 } | 3838 } |
| 3836 base::ElapsedTimer compile_timer; | 3839 base::ElapsedTimer compile_timer; |
| 3837 if (FLAG_trace_wasm_decode_time) { | 3840 if (FLAG_trace_wasm_decode_time) { |
| 3838 compile_timer.Start(); | 3841 compile_timer.Start(); |
| 3839 } | 3842 } |
| 3840 Handle<Code> code = info_.code(); | 3843 Handle<Code> code = info_.code(); |
| 3841 DCHECK(!code.is_null()); | 3844 DCHECK(!code.is_null()); |
| 3842 | 3845 |
| 3843 if (isolate_->logger()->is_logging_code_events() || | 3846 if (isolate_->logger()->is_logging_code_events() || |
| 3844 isolate_->is_profiling()) { | 3847 isolate_->is_profiling()) { |
| 3845 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate_, code, | 3848 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate_, code, |
| 3846 "WASM_function", function_->func_index, | 3849 "WASM_function", function_->func_index, |
| 3847 wasm::WasmName("module"), | 3850 wasm::WasmName("module"), |
| 3848 module_env_->GetName(function_)); | 3851 module_env_->wire_bytes.GetName(function_)); |
| 3849 } | 3852 } |
| 3850 | 3853 |
| 3851 if (FLAG_trace_wasm_decode_time) { | 3854 if (FLAG_trace_wasm_decode_time) { |
| 3852 double compile_ms = compile_timer.Elapsed().InMillisecondsF(); | 3855 double compile_ms = compile_timer.Elapsed().InMillisecondsF(); |
| 3853 PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n", | 3856 PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n", |
| 3854 static_cast<int>(function_->code_end_offset - | 3857 static_cast<int>(function_->code_end_offset - |
| 3855 function_->code_start_offset), | 3858 function_->code_start_offset), |
| 3856 compile_ms); | 3859 compile_ms); |
| 3857 } | 3860 } |
| 3858 | 3861 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3873 Smi::FromInt(instruction.instr_offset)); | 3876 Smi::FromInt(instruction.instr_offset)); |
| 3874 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, | 3877 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, |
| 3875 Smi::FromInt(instruction.landing_offset)); | 3878 Smi::FromInt(instruction.landing_offset)); |
| 3876 } | 3879 } |
| 3877 return fn_protected; | 3880 return fn_protected; |
| 3878 } | 3881 } |
| 3879 | 3882 |
| 3880 } // namespace compiler | 3883 } // namespace compiler |
| 3881 } // namespace internal | 3884 } // namespace internal |
| 3882 } // namespace v8 | 3885 } // namespace v8 |
| OLD | NEW |