| 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 2433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2444 Node* WasmGraphBuilder::BuildJavaScriptToNumber(Node* node, Node* context) { | 2444 Node* WasmGraphBuilder::BuildJavaScriptToNumber(Node* node, Node* context) { |
| 2445 Callable callable = CodeFactory::ToNumber(jsgraph()->isolate()); | 2445 Callable callable = CodeFactory::ToNumber(jsgraph()->isolate()); |
| 2446 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 2446 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 2447 jsgraph()->isolate(), jsgraph()->zone(), callable.descriptor(), 0, | 2447 jsgraph()->isolate(), jsgraph()->zone(), callable.descriptor(), 0, |
| 2448 CallDescriptor::kNoFlags, Operator::kNoProperties); | 2448 CallDescriptor::kNoFlags, Operator::kNoProperties); |
| 2449 Node* stub_code = jsgraph()->HeapConstant(callable.code()); | 2449 Node* stub_code = jsgraph()->HeapConstant(callable.code()); |
| 2450 | 2450 |
| 2451 Node* result = graph()->NewNode(jsgraph()->common()->Call(desc), stub_code, | 2451 Node* result = graph()->NewNode(jsgraph()->common()->Call(desc), stub_code, |
| 2452 node, context, *effect_, *control_); | 2452 node, context, *effect_, *control_); |
| 2453 | 2453 |
| 2454 SetSourcePosition(result, 1); |
| 2455 |
| 2454 *effect_ = result; | 2456 *effect_ = result; |
| 2455 | 2457 |
| 2456 return result; | 2458 return result; |
| 2457 } | 2459 } |
| 2458 | 2460 |
| 2459 bool CanCover(Node* value, IrOpcode::Value opcode) { | 2461 bool CanCover(Node* value, IrOpcode::Value opcode) { |
| 2460 if (value->opcode() != opcode) return false; | 2462 if (value->opcode() != opcode) return false; |
| 2461 bool first = true; | 2463 bool first = true; |
| 2462 for (Edge const edge : value->use_edges()) { | 2464 for (Edge const edge : value->use_edges()) { |
| 2463 if (NodeProperties::IsControlEdge(edge)) continue; | 2465 if (NodeProperties::IsControlEdge(edge)) continue; |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2843 // the target is a native function, or if the target is a callable JSObject, | 2845 // the target is a native function, or if the target is a callable JSObject, |
| 2844 // which can only be constructed by the runtime. | 2846 // which can only be constructed by the runtime. |
| 2845 args[pos++] = HeapConstant(isolate->native_context()); | 2847 args[pos++] = HeapConstant(isolate->native_context()); |
| 2846 args[pos++] = *effect_; | 2848 args[pos++] = *effect_; |
| 2847 args[pos++] = *control_; | 2849 args[pos++] = *control_; |
| 2848 | 2850 |
| 2849 call = graph()->NewNode(jsgraph()->common()->Call(desc), pos, args); | 2851 call = graph()->NewNode(jsgraph()->common()->Call(desc), pos, args); |
| 2850 } | 2852 } |
| 2851 | 2853 |
| 2852 *effect_ = call; | 2854 *effect_ = call; |
| 2855 SetSourcePosition(call, 0); |
| 2853 | 2856 |
| 2854 // Convert the return value back. | 2857 // Convert the return value back. |
| 2855 Node* i32_zero = jsgraph()->Int32Constant(0); | 2858 Node* i32_zero = jsgraph()->Int32Constant(0); |
| 2856 Node* val = sig->return_count() == 0 | 2859 Node* val = sig->return_count() == 0 |
| 2857 ? i32_zero | 2860 ? i32_zero |
| 2858 : FromJS(call, HeapConstant(isolate->native_context()), | 2861 : FromJS(call, HeapConstant(isolate->native_context()), |
| 2859 sig->GetReturn()); | 2862 sig->GetReturn()); |
| 2860 Node* ret = graph()->NewNode(jsgraph()->common()->Return(), i32_zero, val, | 2863 Node* ret = graph()->NewNode(jsgraph()->common()->Return(), i32_zero, val, |
| 2861 *effect_, start); | 2864 *effect_, start); |
| 2862 | 2865 |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3317 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate, code, | 3320 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate, code, |
| 3318 "js-to-wasm", index, wasm::WasmName("export"), | 3321 "js-to-wasm", index, wasm::WasmName("export"), |
| 3319 CStrVector(func_name)); | 3322 CStrVector(func_name)); |
| 3320 } | 3323 } |
| 3321 return code; | 3324 return code; |
| 3322 } | 3325 } |
| 3323 | 3326 |
| 3324 Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, Handle<JSReceiver> target, | 3327 Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, Handle<JSReceiver> target, |
| 3325 wasm::FunctionSig* sig, uint32_t index, | 3328 wasm::FunctionSig* sig, uint32_t index, |
| 3326 Handle<String> module_name, | 3329 Handle<String> module_name, |
| 3327 MaybeHandle<String> import_name) { | 3330 MaybeHandle<String> import_name, |
| 3331 wasm::ModuleOrigin origin) { |
| 3328 //---------------------------------------------------------------------------- | 3332 //---------------------------------------------------------------------------- |
| 3329 // Create the Graph | 3333 // Create the Graph |
| 3330 //---------------------------------------------------------------------------- | 3334 //---------------------------------------------------------------------------- |
| 3331 Zone zone(isolate->allocator(), ZONE_NAME); | 3335 Zone zone(isolate->allocator(), ZONE_NAME); |
| 3332 Graph graph(&zone); | 3336 Graph graph(&zone); |
| 3333 CommonOperatorBuilder common(&zone); | 3337 CommonOperatorBuilder common(&zone); |
| 3334 MachineOperatorBuilder machine(&zone); | 3338 MachineOperatorBuilder machine(&zone); |
| 3335 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); | 3339 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); |
| 3336 | 3340 |
| 3337 Node* control = nullptr; | 3341 Node* control = nullptr; |
| 3338 Node* effect = nullptr; | 3342 Node* effect = nullptr; |
| 3339 | 3343 |
| 3340 WasmGraphBuilder builder(&zone, &jsgraph, sig); | 3344 SourcePositionTable* source_position_table = |
| 3345 origin == wasm::kAsmJsOrigin ? new (&zone) SourcePositionTable(&graph) |
| 3346 : nullptr; |
| 3347 |
| 3348 WasmGraphBuilder builder(&zone, &jsgraph, sig, source_position_table); |
| 3341 builder.set_control_ptr(&control); | 3349 builder.set_control_ptr(&control); |
| 3342 builder.set_effect_ptr(&effect); | 3350 builder.set_effect_ptr(&effect); |
| 3343 builder.BuildWasmToJSWrapper(target, sig); | 3351 builder.BuildWasmToJSWrapper(target, sig); |
| 3344 | 3352 |
| 3345 Handle<Code> code = Handle<Code>::null(); | 3353 Handle<Code> code = Handle<Code>::null(); |
| 3346 { | 3354 { |
| 3347 if (FLAG_trace_turbo_graph) { // Simple textual RPO. | 3355 if (FLAG_trace_turbo_graph) { // Simple textual RPO. |
| 3348 OFStream os(stdout); | 3356 OFStream os(stdout); |
| 3349 os << "-- Graph after change lowering -- " << std::endl; | 3357 os << "-- Graph after change lowering -- " << std::endl; |
| 3350 os << AsRPO(graph); | 3358 os << AsRPO(graph); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3366 Vector<const char> func_name = ArrayVector("wasm-to-js"); | 3374 Vector<const char> func_name = ArrayVector("wasm-to-js"); |
| 3367 static unsigned id = 0; | 3375 static unsigned id = 0; |
| 3368 Vector<char> buffer; | 3376 Vector<char> buffer; |
| 3369 if (debugging) { | 3377 if (debugging) { |
| 3370 buffer = Vector<char>::New(128); | 3378 buffer = Vector<char>::New(128); |
| 3371 int chars = SNPrintF(buffer, "wasm-to-js#%d", id); | 3379 int chars = SNPrintF(buffer, "wasm-to-js#%d", id); |
| 3372 func_name = Vector<const char>::cast(buffer.SubVector(0, chars)); | 3380 func_name = Vector<const char>::cast(buffer.SubVector(0, chars)); |
| 3373 } | 3381 } |
| 3374 | 3382 |
| 3375 CompilationInfo info(func_name, isolate, &zone, flags); | 3383 CompilationInfo info(func_name, isolate, &zone, flags); |
| 3376 code = Pipeline::GenerateCodeForTesting(&info, incoming, &graph, nullptr); | 3384 code = Pipeline::GenerateCodeForTesting(&info, incoming, &graph, nullptr, |
| 3385 source_position_table); |
| 3377 #ifdef ENABLE_DISASSEMBLER | 3386 #ifdef ENABLE_DISASSEMBLER |
| 3378 if (FLAG_print_opt_code && !code.is_null()) { | 3387 if (FLAG_print_opt_code && !code.is_null()) { |
| 3379 OFStream os(stdout); | 3388 OFStream os(stdout); |
| 3380 code->Disassemble(buffer.start(), os); | 3389 code->Disassemble(buffer.start(), os); |
| 3381 } | 3390 } |
| 3382 #endif | 3391 #endif |
| 3383 if (debugging) { | 3392 if (debugging) { |
| 3384 buffer.Dispose(); | 3393 buffer.Dispose(); |
| 3385 } | 3394 } |
| 3386 } | 3395 } |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3600 Smi::FromInt(instruction.instr_offset)); | 3609 Smi::FromInt(instruction.instr_offset)); |
| 3601 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, | 3610 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, |
| 3602 Smi::FromInt(instruction.landing_offset)); | 3611 Smi::FromInt(instruction.landing_offset)); |
| 3603 } | 3612 } |
| 3604 return fn_protected; | 3613 return fn_protected; |
| 3605 } | 3614 } |
| 3606 | 3615 |
| 3607 } // namespace compiler | 3616 } // namespace compiler |
| 3608 } // namespace internal | 3617 } // namespace internal |
| 3609 } // namespace v8 | 3618 } // namespace v8 |
| OLD | NEW |