Chromium Code Reviews| 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 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 242 trap_position_smi, // byte position | 242 trap_position_smi, // byte position |
| 243 jsgraph()->ExternalConstant( | 243 jsgraph()->ExternalConstant( |
| 244 ExternalReference(f, jsgraph()->isolate())), // ref | 244 ExternalReference(f, jsgraph()->isolate())), // ref |
| 245 jsgraph()->Int32Constant(fun->nargs), // arity | 245 jsgraph()->Int32Constant(fun->nargs), // arity |
| 246 builder_->HeapConstant(module->instance->context), // context | 246 builder_->HeapConstant(module->instance->context), // context |
| 247 *effect_ptr, | 247 *effect_ptr, |
| 248 *control_ptr}; | 248 *control_ptr}; |
| 249 | 249 |
| 250 Node* node = graph()->NewNode( | 250 Node* node = graph()->NewNode( |
| 251 common()->Call(desc), static_cast<int>(arraysize(inputs)), inputs); | 251 common()->Call(desc), static_cast<int>(arraysize(inputs)), inputs); |
| 252 *control_ptr = node; | |
| 253 *effect_ptr = node; | 252 *effect_ptr = node; |
| 253 *control_ptr = graph()->NewNode(common()->IfSuccess(), node); | |
|
ahaas
2016/08/10 10:34:58
node is a call to Runtime::ThrowWasmError, which h
bgeron
2016/08/10 10:41:56
Nope, that's it! Committing.
| |
| 254 } | 254 } |
| 255 if (false) { | 255 if (false) { |
| 256 // End the control flow with a throw | 256 // End the control flow with a throw |
| 257 Node* thrw = | 257 Node* thrw = |
| 258 graph()->NewNode(common()->Throw(), jsgraph()->ZeroConstant(), | 258 graph()->NewNode(common()->Throw(), jsgraph()->ZeroConstant(), |
| 259 *effect_ptr, *control_ptr); | 259 *effect_ptr, *control_ptr); |
| 260 end = thrw; | 260 end = thrw; |
| 261 } else { | 261 } else { |
| 262 // End the control flow with returning 0xdeadbeef | 262 // End the control flow with returning 0xdeadbeef |
| 263 Node* ret_value = GetTrapValue(builder_->GetFunctionSignature()); | 263 Node* ret_value = GetTrapValue(builder_->GetFunctionSignature()); |
| (...skipping 1391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1655 graph()->NewNode(load_op, stack_slot_result, jsgraph()->Int32Constant(0), | 1655 graph()->NewNode(load_op, stack_slot_result, jsgraph()->Int32Constant(0), |
| 1656 *effect_, *control_); | 1656 *effect_, *control_); |
| 1657 *effect_ = load; | 1657 *effect_ = load; |
| 1658 return load; | 1658 return load; |
| 1659 } | 1659 } |
| 1660 | 1660 |
| 1661 Node* WasmGraphBuilder::BuildGrowMemory(Node* input) { | 1661 Node* WasmGraphBuilder::BuildGrowMemory(Node* input) { |
| 1662 Runtime::FunctionId function_id = Runtime::kWasmGrowMemory; | 1662 Runtime::FunctionId function_id = Runtime::kWasmGrowMemory; |
| 1663 const Runtime::Function* function = Runtime::FunctionForId(function_id); | 1663 const Runtime::Function* function = Runtime::FunctionForId(function_id); |
| 1664 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 1664 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( |
| 1665 jsgraph()->zone(), function_id, function->nargs, Operator::kNoProperties, | 1665 jsgraph()->zone(), function_id, function->nargs, Operator::kNoThrow, |
| 1666 CallDescriptor::kNoFlags); | 1666 CallDescriptor::kNoFlags); |
| 1667 Node** control_ptr = control_; | 1667 Node** control_ptr = control_; |
| 1668 Node** effect_ptr = effect_; | 1668 Node** effect_ptr = effect_; |
| 1669 wasm::ModuleEnv* module = module_; | 1669 wasm::ModuleEnv* module = module_; |
| 1670 input = BuildChangeUint32ToSmi(input); | 1670 input = BuildChangeUint32ToSmi(input); |
| 1671 Node* inputs[] = { | 1671 Node* inputs[] = { |
| 1672 jsgraph()->CEntryStubConstant(function->result_size), input, // C entry | 1672 jsgraph()->CEntryStubConstant(function->result_size), input, // C entry |
| 1673 jsgraph()->ExternalConstant( | 1673 jsgraph()->ExternalConstant( |
| 1674 ExternalReference(function_id, jsgraph()->isolate())), // ref | 1674 ExternalReference(function_id, jsgraph()->isolate())), // ref |
| 1675 jsgraph()->Int32Constant(function->nargs), // arity | 1675 jsgraph()->Int32Constant(function->nargs), // arity |
| 1676 jsgraph()->HeapConstant(module->instance->context), // context | 1676 jsgraph()->HeapConstant(module->instance->context), // context |
| 1677 *effect_ptr, | 1677 *effect_ptr, |
| 1678 *control_ptr}; | 1678 *control_ptr}; |
| 1679 Node* node = graph()->NewNode(jsgraph()->common()->Call(desc), | 1679 Node* node = graph()->NewNode(jsgraph()->common()->Call(desc), |
| 1680 static_cast<int>(arraysize(inputs)), inputs); | 1680 static_cast<int>(arraysize(inputs)), inputs); |
| 1681 *control_ptr = node; | |
| 1682 *effect_ptr = node; | 1681 *effect_ptr = node; |
| 1683 node = BuildChangeSmiToInt32(node); | 1682 node = BuildChangeSmiToInt32(node); |
| 1684 return node; | 1683 return node; |
| 1685 } | 1684 } |
| 1686 | 1685 |
| 1687 Node* WasmGraphBuilder::BuildI32DivS(Node* left, Node* right, | 1686 Node* WasmGraphBuilder::BuildI32DivS(Node* left, Node* right, |
| 1688 wasm::WasmCodePosition position) { | 1687 wasm::WasmCodePosition position) { |
| 1689 MachineOperatorBuilder* m = jsgraph()->machine(); | 1688 MachineOperatorBuilder* m = jsgraph()->machine(); |
| 1690 trap_->ZeroCheck32(wasm::kTrapDivByZero, right, position); | 1689 trap_->ZeroCheck32(wasm::kTrapDivByZero, right, position); |
| 1691 Node* before = *control_; | 1690 Node* before = *control_; |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2222 Node* effect, Node* control) { | 2221 Node* effect, Node* control) { |
| 2223 Callable callable = CodeFactory::ToNumber(jsgraph()->isolate()); | 2222 Callable callable = CodeFactory::ToNumber(jsgraph()->isolate()); |
| 2224 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 2223 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 2225 jsgraph()->isolate(), jsgraph()->zone(), callable.descriptor(), 0, | 2224 jsgraph()->isolate(), jsgraph()->zone(), callable.descriptor(), 0, |
| 2226 CallDescriptor::kNoFlags, Operator::kNoProperties); | 2225 CallDescriptor::kNoFlags, Operator::kNoProperties); |
| 2227 Node* stub_code = jsgraph()->HeapConstant(callable.code()); | 2226 Node* stub_code = jsgraph()->HeapConstant(callable.code()); |
| 2228 | 2227 |
| 2229 Node* result = graph()->NewNode(jsgraph()->common()->Call(desc), stub_code, | 2228 Node* result = graph()->NewNode(jsgraph()->common()->Call(desc), stub_code, |
| 2230 node, context, effect, control); | 2229 node, context, effect, control); |
| 2231 | 2230 |
| 2232 *control_ = result; | |
| 2233 *effect_ = result; | 2231 *effect_ = result; |
| 2232 *control_ = graph()->NewNode(jsgraph()->common()->IfSuccess(), result); | |
| 2234 | 2233 |
| 2235 return result; | 2234 return result; |
| 2236 } | 2235 } |
| 2237 | 2236 |
| 2238 bool CanCover(Node* value, IrOpcode::Value opcode) { | 2237 bool CanCover(Node* value, IrOpcode::Value opcode) { |
| 2239 if (value->opcode() != opcode) return false; | 2238 if (value->opcode() != opcode) return false; |
| 2240 bool first = true; | 2239 bool first = true; |
| 2241 for (Edge const edge : value->use_edges()) { | 2240 for (Edge const edge : value->use_edges()) { |
| 2242 if (NodeProperties::IsControlEdge(edge)) continue; | 2241 if (NodeProperties::IsControlEdge(edge)) continue; |
| 2243 if (NodeProperties::IsEffectEdge(edge)) continue; | 2242 if (NodeProperties::IsEffectEdge(edge)) continue; |
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3324 function_->code_start_offset), | 3323 function_->code_start_offset), |
| 3325 compile_ms); | 3324 compile_ms); |
| 3326 } | 3325 } |
| 3327 | 3326 |
| 3328 return code; | 3327 return code; |
| 3329 } | 3328 } |
| 3330 | 3329 |
| 3331 } // namespace compiler | 3330 } // namespace compiler |
| 3332 } // namespace internal | 3331 } // namespace internal |
| 3333 } // namespace v8 | 3332 } // namespace v8 |
| OLD | NEW |