| Index: src/compiler/wasm-compiler.cc
|
| diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
|
| index 8357635e017879f12aaa9baaf0a16a0d035c331a..1e196ef0fc2b974178cce8f5d847deda3f226b97 100644
|
| --- a/src/compiler/wasm-compiler.cc
|
| +++ b/src/compiler/wasm-compiler.cc
|
| @@ -232,14 +232,17 @@ class WasmTrapHelper : public ZoneObject {
|
| CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(
|
| jsgraph()->zone(), f, fun->nargs, Operator::kNoProperties,
|
| CallDescriptor::kNoFlags);
|
| + // CEntryStubConstant nodes have to be created and cached in the main
|
| + // thread. At the moment this is only done for CEntryStubConstant(1).
|
| + DCHECK_EQ(1, fun->result_size);
|
| Node* inputs[] = {
|
| jsgraph()->CEntryStubConstant(fun->result_size), // C entry
|
| trap_reason_smi, // message id
|
| trap_position_smi, // byte position
|
| jsgraph()->ExternalConstant(
|
| - ExternalReference(f, jsgraph()->isolate())), // ref
|
| - jsgraph()->Int32Constant(fun->nargs), // arity
|
| - jsgraph()->Constant(module->instance->context), // context
|
| + ExternalReference(f, jsgraph()->isolate())), // ref
|
| + jsgraph()->Int32Constant(fun->nargs), // arity
|
| + builder_->HeapConstant(module->instance->context), // context
|
| *effect_ptr,
|
| *control_ptr};
|
|
|
| @@ -890,8 +893,8 @@ Node* WasmGraphBuilder::Float64Constant(double value) {
|
| return jsgraph()->Float64Constant(value);
|
| }
|
|
|
| -Node* WasmGraphBuilder::Constant(Handle<Object> value) {
|
| - return jsgraph()->Constant(value);
|
| +Node* WasmGraphBuilder::HeapConstant(Handle<HeapObject> value) {
|
| + return jsgraph()->HeapConstant(value);
|
| }
|
|
|
| Node* WasmGraphBuilder::Branch(Node* cond, Node** true_node,
|
| @@ -1893,7 +1896,7 @@ Node* WasmGraphBuilder::CallDirect(uint32_t index, Node** args,
|
| DCHECK_NULL(args[0]);
|
|
|
| // Add code object as constant.
|
| - args[0] = Constant(module_->GetFunctionCode(index));
|
| + args[0] = HeapConstant(module_->GetFunctionCode(index));
|
| wasm::FunctionSig* sig = module_->GetFunctionSignature(index);
|
|
|
| return BuildWasmCall(sig, args, position);
|
| @@ -1904,7 +1907,7 @@ Node* WasmGraphBuilder::CallImport(uint32_t index, Node** args,
|
| DCHECK_NULL(args[0]);
|
|
|
| // Add code object as constant.
|
| - args[0] = Constant(module_->GetImportCode(index));
|
| + args[0] = HeapConstant(module_->GetImportCode(index));
|
| wasm::FunctionSig* sig = module_->GetImportSignature(index);
|
|
|
| return BuildWasmCall(sig, args, position);
|
| @@ -2382,7 +2385,7 @@ void WasmGraphBuilder::BuildJSToWasmWrapper(Handle<Code> wasm_code,
|
| graph()->start());
|
|
|
| int pos = 0;
|
| - args[pos++] = Constant(wasm_code);
|
| + args[pos++] = HeapConstant(wasm_code);
|
|
|
| // Convert JS parameters to WASM numbers.
|
| for (int i = 0; i < wasm_count; i++) {
|
| @@ -2440,7 +2443,7 @@ void WasmGraphBuilder::BuildWasmToJSWrapper(Handle<JSFunction> function,
|
| *effect_ = start;
|
| *control_ = start;
|
| // JS context is the last parameter.
|
| - Node* context = Constant(Handle<Context>(function->context(), isolate));
|
| + Node* context = HeapConstant(Handle<Context>(function->context(), isolate));
|
| Node** args = Buffer(wasm_count + 7);
|
|
|
| bool arg_count_before_args = false;
|
| @@ -2545,7 +2548,7 @@ Node* WasmGraphBuilder::FunctionTable() {
|
| DCHECK(module_ && module_->instance &&
|
| !module_->instance->function_table.is_null());
|
| if (!function_table_) {
|
| - function_table_ = jsgraph()->Constant(module_->instance->function_table);
|
| + function_table_ = HeapConstant(module_->instance->function_table);
|
| }
|
| return function_table_;
|
| }
|
| @@ -2885,7 +2888,7 @@ Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, wasm::ModuleEnv* module,
|
| }
|
|
|
| std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| - Zone* zone, wasm::ErrorThrower* thrower, Isolate* isolate,
|
| + JSGraph* jsgraph, wasm::ErrorThrower* thrower, Isolate* isolate,
|
| wasm::ModuleEnv*& module_env, const wasm::WasmFunction* function,
|
| double* decode_ms) {
|
| base::ElapsedTimer decode_timer;
|
| @@ -2893,16 +2896,13 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| decode_timer.Start();
|
| }
|
| // Create a TF graph during decoding.
|
| - Graph* graph = new (zone) Graph(zone);
|
| - CommonOperatorBuilder* common = new (zone) CommonOperatorBuilder(zone);
|
| - MachineOperatorBuilder* machine = new (zone) MachineOperatorBuilder(
|
| - zone, MachineType::PointerRepresentation(),
|
| - InstructionSelector::SupportedMachineOperatorFlags());
|
| - JSGraph* jsgraph =
|
| - new (zone) JSGraph(isolate, graph, common, nullptr, nullptr, machine);
|
| + Graph* graph = jsgraph->graph();
|
| + CommonOperatorBuilder* common = jsgraph->common();
|
| + MachineOperatorBuilder* machine = jsgraph->machine();
|
| SourcePositionTable* source_position_table =
|
| - new (zone) SourcePositionTable(graph);
|
| - WasmGraphBuilder builder(zone, jsgraph, function->sig, source_position_table);
|
| + new (jsgraph->zone()) SourcePositionTable(graph);
|
| + WasmGraphBuilder builder(jsgraph->zone(), jsgraph, function->sig,
|
| + source_position_table);
|
| wasm::FunctionBody body = {
|
| module_env, function->sig, module_env->module->module_start,
|
| module_env->module->module_start + function->code_start_offset,
|
| @@ -2911,7 +2911,7 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| wasm::BuildTFGraph(isolate->allocator(), &builder, body);
|
|
|
| if (machine->Is32()) {
|
| - Int64Lowering r(graph, machine, common, zone, function->sig);
|
| + Int64Lowering r(graph, machine, common, jsgraph->zone(), function->sig);
|
| r.LowerGraph();
|
| }
|
|
|
| @@ -2948,6 +2948,14 @@ class WasmCompilationUnit {
|
| isolate_(isolate),
|
| module_env_(module_env),
|
| function_(function),
|
| + graph_zone_(new Zone(isolate->allocator())),
|
| + jsgraph_(new (graph_zone()) JSGraph(
|
| + isolate, new (graph_zone()) Graph(graph_zone()),
|
| + new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr,
|
| + nullptr,
|
| + new (graph_zone()) MachineOperatorBuilder(
|
| + graph_zone(), MachineType::PointerRepresentation(),
|
| + InstructionSelector::SupportedMachineOperatorFlags()))),
|
| compilation_zone_(isolate->allocator()),
|
| info_(function->name_length != 0
|
| ? module_env->module->GetNameOrNull(function->name_offset,
|
| @@ -2957,11 +2965,17 @@ class WasmCompilationUnit {
|
| Code::ComputeFlags(Code::WASM_FUNCTION)),
|
| job_(),
|
| index_(index),
|
| - ok_(true) {}
|
| + ok_(true) {
|
| + // Create and cache this node in the main thread.
|
| + jsgraph_->CEntryStubConstant(1);
|
| + }
|
| +
|
| + Zone* graph_zone() { return graph_zone_.get(); }
|
|
|
| void ExecuteCompilation() {
|
| - HistogramTimerScope wasm_compile_function_time_scope(
|
| - isolate_->counters()->wasm_compile_function_time());
|
| + // TODO(ahaas): The counters are not thread-safe at the moment.
|
| + // HistogramTimerScope wasm_compile_function_time_scope(
|
| + // isolate_->counters()->wasm_compile_function_time());
|
| if (FLAG_trace_wasm_compiler) {
|
| OFStream os(stdout);
|
| os << "Compiling WASM function "
|
| @@ -2972,9 +2986,9 @@ class WasmCompilationUnit {
|
| double decode_ms = 0;
|
| size_t node_count = 0;
|
|
|
| - Zone zone(isolate_->allocator());
|
| + base::SmartPointer<Zone> graph_zone(graph_zone_.Detach());
|
| std::pair<JSGraph*, SourcePositionTable*> graph_result =
|
| - BuildGraphForWasmFunction(&zone, thrower_, isolate_, module_env_,
|
| + BuildGraphForWasmFunction(jsgraph_, thrower_, isolate_, module_env_,
|
| function_, &decode_ms);
|
| JSGraph* jsgraph = graph_result.first;
|
| SourcePositionTable* source_positions = graph_result.second;
|
| @@ -3001,8 +3015,9 @@ class WasmCompilationUnit {
|
| descriptor, source_positions));
|
| ok_ = job_->OptimizeGraph() == CompilationJob::SUCCEEDED;
|
| // TODO(bradnelson): Improve histogram handling of size_t.
|
| - isolate_->counters()->wasm_compile_function_peak_memory_bytes()->AddSample(
|
| - static_cast<int>(jsgraph->graph()->zone()->allocation_size()));
|
| + // TODO(ahaas): The counters are not thread-safe at the moment.
|
| + // isolate_->counters()->wasm_compile_function_peak_memory_bytes()->AddSample(
|
| + // static_cast<int>(jsgraph->graph()->zone()->allocation_size()));
|
|
|
| if (FLAG_trace_wasm_decode_time) {
|
| double pipeline_ms = pipeline_timer.Elapsed().InMillisecondsF();
|
| @@ -3059,6 +3074,9 @@ class WasmCompilationUnit {
|
| Isolate* isolate_;
|
| wasm::ModuleEnv* module_env_;
|
| const wasm::WasmFunction* function_;
|
| + // The graph zone is deallocated at the end of ExecuteCompilation.
|
| + base::SmartPointer<Zone> graph_zone_;
|
| + JSGraph* jsgraph_;
|
| Zone compilation_zone_;
|
| CompilationInfo info_;
|
| base::SmartPointer<CompilationJob> job_;
|
|
|