5 #include "src/wasm/function-compiler.h" 7 #include "src/compiler/wasm-compiler.h" 8 #include "src/counters.h" 9 #include "src/macro-assembler-inl.h" 10 #include "src/wasm/baseline/liftoff-compiler.h" 11 #include "src/wasm/wasm-code-manager.h" 19 const char* GetExecutionTierAsString(ExecutionTier tier) {
21 case ExecutionTier::kBaseline:
23 case ExecutionTier::kOptimized:
25 case ExecutionTier::kInterpreter:
34 ExecutionTier WasmCompilationUnit::GetDefaultExecutionTier() {
35 return FLAG_liftoff ? ExecutionTier::kBaseline : ExecutionTier::kOptimized;
38 WasmCompilationUnit::WasmCompilationUnit(WasmEngine* wasm_engine,
39 NativeModule* native_module,
int index,
41 : wasm_engine_(wasm_engine),
43 native_module_(native_module),
45 const WasmModule* module = native_module->module();
46 DCHECK_GE(index, module->num_imported_functions);
47 DCHECK_LT(index, module->functions.size());
51 if (module->origin == kAsmJsOrigin) tier = ExecutionTier::kOptimized;
52 if (V8_UNLIKELY(FLAG_wasm_tier_mask_for_testing) && index < 32 &&
53 (FLAG_wasm_tier_mask_for_testing & (1 << index))) {
54 tier = ExecutionTier::kOptimized;
61 WasmCompilationUnit::~WasmCompilationUnit() =
default;
63 void WasmCompilationUnit::ExecuteCompilation(
64 CompilationEnv* env, std::shared_ptr<WireBytesStorage> wire_bytes_storage,
65 Counters* counters, WasmFeatures* detected) {
66 const WasmModule* module = native_module_->module();
67 DCHECK_EQ(module, env->module);
69 auto* func = &env->module->functions[func_index_];
70 Vector<const uint8_t> code = wire_bytes_storage->GetCode(func->code);
71 wasm::FunctionBody func_body{func->sig, func->code.offset(), code.start(),
75 SELECT_WASM_COUNTER(counters, module->origin, wasm, function_size_bytes);
76 size_histogram->AddSample(static_cast<int>(func_body.end - func_body.start));
77 auto timed_histogram = SELECT_WASM_COUNTER(counters, module->origin,
78 wasm_compile, function_time);
79 TimedHistogramScope wasm_compile_function_time_scope(timed_histogram);
81 if (FLAG_trace_wasm_compiler) {
82 PrintF(
"Compiling wasm function %d with %s\n\n", func_index_,
83 GetExecutionTierAsString(tier_));
87 case ExecutionTier::kBaseline:
88 if (liftoff_unit_->ExecuteCompilation(env, func_body, counters,
93 SwitchTier(ExecutionTier::kOptimized);
97 case ExecutionTier::kOptimized:
98 turbofan_unit_->ExecuteCompilation(env, func_body, counters, detected);
100 case ExecutionTier::kInterpreter:
105 void WasmCompilationUnit::SwitchTier(ExecutionTier new_tier) {
111 case ExecutionTier::kBaseline:
112 DCHECK(!turbofan_unit_);
113 DCHECK(!liftoff_unit_);
114 liftoff_unit_.reset(
new LiftoffCompilationUnit(
this));
116 case ExecutionTier::kOptimized:
117 DCHECK(!turbofan_unit_);
118 liftoff_unit_.reset();
119 turbofan_unit_.reset(
new compiler::TurbofanWasmCompilationUnit(
this));
121 case ExecutionTier::kInterpreter:
128 bool WasmCompilationUnit::CompileWasmFunction(Isolate* isolate,
129 NativeModule* native_module,
130 WasmFeatures* detected,
131 const WasmFunction*
function,
132 ExecutionTier tier) {
133 ModuleWireBytes wire_bytes(native_module->wire_bytes());
134 FunctionBody function_body{
function->sig,
function->code.offset(),
135 wire_bytes.start() +
function->code.offset(),
136 wire_bytes.start() +
function->code.end_offset()};
138 WasmCompilationUnit unit(isolate->wasm_engine(), native_module,
139 function->func_index, tier);
140 CompilationEnv env = native_module->CreateCompilationEnv();
141 unit.ExecuteCompilation(
142 &env, native_module->compilation_state()->GetWireBytesStorage(),
143 isolate->counters(), detected);
144 return !unit.failed();
147 void WasmCompilationUnit::SetResult(WasmCode* code, Counters* counters) {
148 DCHECK_NULL(result_);
150 native_module()->PublishCode(code);
152 counters->wasm_generated_code_size()->Increment(
153 static_cast<int>(code->instructions().size()));
154 counters->wasm_reloc_size()->Increment(
155 static_cast<int>(code->reloc_info().size()));