Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index f0312e89461c0436d7de78685fc313f62fa5e8eb..93d5a084b9a9ce7954d4101760c14426a12b892b 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -72,28 +72,8 @@ void MergeControlToEnd(JSGraph* jsgraph, Node* node) { |
} |
} |
- |
-enum TrapReason { |
- kTrapUnreachable, |
- kTrapMemOutOfBounds, |
- kTrapDivByZero, |
- kTrapDivUnrepresentable, |
- kTrapRemByZero, |
- kTrapFloatUnrepresentable, |
- kTrapFuncInvalid, |
- kTrapFuncSigMismatch, |
- kTrapCount |
-}; |
- |
- |
-static const char* kTrapMessages[] = { |
- "unreachable", "memory access out of bounds", |
- "divide by zero", "divide result unrepresentable", |
- "remainder by zero", "integer result unrepresentable", |
- "invalid function", "function signature mismatch"}; |
} // namespace |
- |
// A helper that handles building graph fragments for trapping. |
// To avoid generating a ton of redundant code that just calls the runtime |
// to trap, we generate a per-trap-reason block of code that all trap sites |
@@ -104,17 +84,17 @@ class WasmTrapHelper : public ZoneObject { |
: builder_(builder), |
jsgraph_(builder->jsgraph()), |
graph_(builder->jsgraph() ? builder->jsgraph()->graph() : nullptr) { |
- for (int i = 0; i < kTrapCount; i++) traps_[i] = nullptr; |
+ for (int i = 0; i < wasm::kTrapCount; i++) traps_[i] = nullptr; |
} |
// Make the current control path trap to unreachable. |
- void Unreachable() { ConnectTrap(kTrapUnreachable); } |
+ void Unreachable() { ConnectTrap(wasm::kTrapUnreachable); } |
// Always trap with the given reason. |
- void TrapAlways(TrapReason reason) { ConnectTrap(reason); } |
+ void TrapAlways(wasm::TrapReason reason) { ConnectTrap(reason); } |
// Add a check that traps if {node} is equal to {val}. |
- Node* TrapIfEq32(TrapReason reason, Node* node, int32_t val) { |
+ Node* TrapIfEq32(wasm::TrapReason reason, Node* node, int32_t val) { |
Int32Matcher m(node); |
if (m.HasValue() && !m.Is(val)) return graph()->start(); |
if (val == 0) { |
@@ -128,12 +108,12 @@ class WasmTrapHelper : public ZoneObject { |
} |
// Add a check that traps if {node} is zero. |
- Node* ZeroCheck32(TrapReason reason, Node* node) { |
+ Node* ZeroCheck32(wasm::TrapReason reason, Node* node) { |
return TrapIfEq32(reason, node, 0); |
} |
// Add a check that traps if {node} is equal to {val}. |
- Node* TrapIfEq64(TrapReason reason, Node* node, int64_t val) { |
+ Node* TrapIfEq64(wasm::TrapReason reason, Node* node, int64_t val) { |
Int64Matcher m(node); |
if (m.HasValue() && !m.Is(val)) return graph()->start(); |
AddTrapIfTrue(reason, |
@@ -143,22 +123,22 @@ class WasmTrapHelper : public ZoneObject { |
} |
// Add a check that traps if {node} is zero. |
- Node* ZeroCheck64(TrapReason reason, Node* node) { |
+ Node* ZeroCheck64(wasm::TrapReason reason, Node* node) { |
return TrapIfEq64(reason, node, 0); |
} |
// Add a trap if {cond} is true. |
- void AddTrapIfTrue(TrapReason reason, Node* cond) { |
+ void AddTrapIfTrue(wasm::TrapReason reason, Node* cond) { |
AddTrapIf(reason, cond, true); |
} |
// Add a trap if {cond} is false. |
- void AddTrapIfFalse(TrapReason reason, Node* cond) { |
+ void AddTrapIfFalse(wasm::TrapReason reason, Node* cond) { |
AddTrapIf(reason, cond, false); |
} |
// Add a trap if {cond} is true or false according to {iftrue}. |
- void AddTrapIf(TrapReason reason, Node* cond, bool iftrue) { |
+ void AddTrapIf(wasm::TrapReason reason, Node* cond, bool iftrue) { |
Node** effect_ptr = builder_->effect_; |
Node** control_ptr = builder_->control_; |
Node* before = *effect_ptr; |
@@ -199,14 +179,14 @@ class WasmTrapHelper : public ZoneObject { |
WasmGraphBuilder* builder_; |
JSGraph* jsgraph_; |
Graph* graph_; |
- Node* traps_[kTrapCount]; |
- Node* effects_[kTrapCount]; |
+ Node* traps_[wasm::kTrapCount]; |
+ Node* effects_[wasm::kTrapCount]; |
JSGraph* jsgraph() { return jsgraph_; } |
Graph* graph() { return jsgraph_->graph(); } |
CommonOperatorBuilder* common() { return jsgraph()->common(); } |
- void ConnectTrap(TrapReason reason) { |
+ void ConnectTrap(wasm::TrapReason reason) { |
if (traps_[reason] == nullptr) { |
// Create trap code for the first time this trap is used. |
return BuildTrapCode(reason); |
@@ -216,8 +196,9 @@ class WasmTrapHelper : public ZoneObject { |
builder_->AppendToPhi(traps_[reason], effects_[reason], builder_->Effect()); |
} |
- void BuildTrapCode(TrapReason reason) { |
- Node* exception = builder_->String(kTrapMessages[reason]); |
+ void BuildTrapCode(wasm::TrapReason reason) { |
+ Node* exception = |
+ builder_->String(wasm::WasmOpcodes::TrapReasonName(reason)); |
Node* end; |
Node** control_ptr = builder_->control_; |
Node** effect_ptr = builder_->effect_; |
@@ -266,7 +247,6 @@ class WasmTrapHelper : public ZoneObject { |
} |
}; |
- |
WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph, |
wasm::FunctionSig* function_signature) |
: zone_(zone), |
@@ -1171,7 +1151,7 @@ Node* WasmGraphBuilder::BuildI32SConvertF32(Node* input) { |
// truncated input value, then there has been an overflow and we trap. |
Node* check = Unop(wasm::kExprF32SConvertI32, result); |
Node* overflow = Binop(wasm::kExprF32Ne, trunc, check); |
- trap_->AddTrapIfTrue(kTrapFloatUnrepresentable, overflow); |
+ trap_->AddTrapIfTrue(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
@@ -1192,7 +1172,7 @@ Node* WasmGraphBuilder::BuildI32SConvertF64(Node* input) { |
// truncated input value, then there has been an overflow and we trap. |
Node* check = Unop(wasm::kExprF64SConvertI32, result); |
Node* overflow = Binop(wasm::kExprF64Ne, trunc, check); |
- trap_->AddTrapIfTrue(kTrapFloatUnrepresentable, overflow); |
+ trap_->AddTrapIfTrue(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
@@ -1215,7 +1195,7 @@ Node* WasmGraphBuilder::BuildI32UConvertF32(Node* input) { |
// truncated input value, then there has been an overflow and we trap. |
Node* check = Unop(wasm::kExprF32UConvertI32, result); |
Node* overflow = Binop(wasm::kExprF32Ne, trunc, check); |
- trap_->AddTrapIfTrue(kTrapFloatUnrepresentable, overflow); |
+ trap_->AddTrapIfTrue(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
@@ -1236,7 +1216,7 @@ Node* WasmGraphBuilder::BuildI32UConvertF64(Node* input) { |
// truncated input value, then there has been an overflow and we trap. |
Node* check = Unop(wasm::kExprF64UConvertI32, result); |
Node* overflow = Binop(wasm::kExprF64Ne, trunc, check); |
- trap_->AddTrapIfTrue(kTrapFloatUnrepresentable, overflow); |
+ trap_->AddTrapIfTrue(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
@@ -1666,7 +1646,7 @@ Node* WasmGraphBuilder::BuildI64SConvertF32(Node* input) { |
Node* result = graph()->NewNode(jsgraph()->common()->Projection(0), trunc); |
Node* overflow = |
graph()->NewNode(jsgraph()->common()->Projection(1), trunc); |
- trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow); |
+ trap_->ZeroCheck64(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
} |
@@ -1682,7 +1662,7 @@ Node* WasmGraphBuilder::BuildI64UConvertF32(Node* input) { |
Node* result = graph()->NewNode(jsgraph()->common()->Projection(0), trunc); |
Node* overflow = |
graph()->NewNode(jsgraph()->common()->Projection(1), trunc); |
- trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow); |
+ trap_->ZeroCheck64(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
} |
@@ -1698,7 +1678,7 @@ Node* WasmGraphBuilder::BuildI64SConvertF64(Node* input) { |
Node* result = graph()->NewNode(jsgraph()->common()->Projection(0), trunc); |
Node* overflow = |
graph()->NewNode(jsgraph()->common()->Projection(1), trunc); |
- trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow); |
+ trap_->ZeroCheck64(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
} |
@@ -1714,7 +1694,7 @@ Node* WasmGraphBuilder::BuildI64UConvertF64(Node* input) { |
Node* result = graph()->NewNode(jsgraph()->common()->Projection(0), trunc); |
Node* overflow = |
graph()->NewNode(jsgraph()->common()->Projection(1), trunc); |
- trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow); |
+ trap_->ZeroCheck64(wasm::kTrapFloatUnrepresentable, overflow); |
return result; |
} |
} |
@@ -1738,7 +1718,7 @@ Node* WasmGraphBuilder::BuildFloatToIntConversionInstruction( |
sig_builder.AddParam(MachineType::Pointer()); |
Node* function = graph()->NewNode(jsgraph()->common()->ExternalConstant(ref)); |
Node* args[] = {function, stack_slot_param, stack_slot_result}; |
- trap_->ZeroCheck32(kTrapFloatUnrepresentable, |
+ trap_->ZeroCheck32(wasm::kTrapFloatUnrepresentable, |
BuildCCall(sig_builder.Build(), args)); |
const Operator* load_op = jsgraph()->machine()->Load(result_type); |
Node* load = |
@@ -1778,7 +1758,7 @@ Node* WasmGraphBuilder::BuildI32DivS(Node* left, Node* right) { |
jsgraph()->Int32Constant(0), div)); |
} |
- trap_->ZeroCheck32(kTrapDivByZero, right); |
+ trap_->ZeroCheck32(wasm::kTrapDivByZero, right); |
Node* before = *control_; |
Node* denom_is_m1; |
Node* denom_is_not_m1; |
@@ -1786,7 +1766,7 @@ Node* WasmGraphBuilder::BuildI32DivS(Node* left, Node* right) { |
graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(-1)), |
&denom_is_m1, &denom_is_not_m1); |
*control_ = denom_is_m1; |
- trap_->TrapIfEq32(kTrapDivUnrepresentable, left, kMinInt); |
+ trap_->TrapIfEq32(wasm::kTrapDivUnrepresentable, left, kMinInt); |
if (*control_ != denom_is_m1) { |
*control_ = graph()->NewNode(jsgraph()->common()->Merge(2), denom_is_not_m1, |
*control_); |
@@ -1819,7 +1799,7 @@ Node* WasmGraphBuilder::BuildI32RemS(Node* left, Node* right) { |
graph()->NewNode(m->Int32Mod(), left, right, d.if_false))); |
} |
- trap_->ZeroCheck32(kTrapRemByZero, right); |
+ trap_->ZeroCheck32(wasm::kTrapRemByZero, right); |
Diamond d( |
graph(), jsgraph()->common(), |
@@ -1851,7 +1831,7 @@ Node* WasmGraphBuilder::BuildI32DivU(Node* left, Node* right) { |
right, z.if_false)); |
} |
return graph()->NewNode(m->Uint32Div(), left, right, |
- trap_->ZeroCheck32(kTrapDivByZero, right)); |
+ trap_->ZeroCheck32(wasm::kTrapDivByZero, right)); |
} |
Node* WasmGraphBuilder::BuildI32RemU(Node* left, Node* right) { |
@@ -1871,16 +1851,16 @@ Node* WasmGraphBuilder::BuildI32RemU(Node* left, Node* right) { |
} |
return graph()->NewNode(m->Uint32Mod(), left, right, |
- trap_->ZeroCheck32(kTrapRemByZero, right)); |
+ trap_->ZeroCheck32(wasm::kTrapRemByZero, right)); |
} |
Node* WasmGraphBuilder::BuildI64DivS(Node* left, Node* right) { |
if (jsgraph()->machine()->Is32()) { |
return BuildDiv64Call( |
left, right, ExternalReference::wasm_int64_div(jsgraph()->isolate()), |
- MachineType::Int64(), kTrapDivByZero); |
+ MachineType::Int64(), wasm::kTrapDivByZero); |
} |
- trap_->ZeroCheck64(kTrapDivByZero, right); |
+ trap_->ZeroCheck64(wasm::kTrapDivByZero, right); |
Node* before = *control_; |
Node* denom_is_m1; |
Node* denom_is_not_m1; |
@@ -1888,7 +1868,7 @@ Node* WasmGraphBuilder::BuildI64DivS(Node* left, Node* right) { |
jsgraph()->Int64Constant(-1)), |
&denom_is_m1, &denom_is_not_m1); |
*control_ = denom_is_m1; |
- trap_->TrapIfEq64(kTrapDivUnrepresentable, left, |
+ trap_->TrapIfEq64(wasm::kTrapDivUnrepresentable, left, |
std::numeric_limits<int64_t>::min()); |
if (*control_ != denom_is_m1) { |
*control_ = graph()->NewNode(jsgraph()->common()->Merge(2), denom_is_not_m1, |
@@ -1904,9 +1884,9 @@ Node* WasmGraphBuilder::BuildI64RemS(Node* left, Node* right) { |
if (jsgraph()->machine()->Is32()) { |
return BuildDiv64Call( |
left, right, ExternalReference::wasm_int64_mod(jsgraph()->isolate()), |
- MachineType::Int64(), kTrapRemByZero); |
+ MachineType::Int64(), wasm::kTrapRemByZero); |
} |
- trap_->ZeroCheck64(kTrapRemByZero, right); |
+ trap_->ZeroCheck64(wasm::kTrapRemByZero, right); |
Diamond d(jsgraph()->graph(), jsgraph()->common(), |
graph()->NewNode(jsgraph()->machine()->Word64Equal(), right, |
jsgraph()->Int64Constant(-1))); |
@@ -1922,19 +1902,19 @@ Node* WasmGraphBuilder::BuildI64DivU(Node* left, Node* right) { |
if (jsgraph()->machine()->Is32()) { |
return BuildDiv64Call( |
left, right, ExternalReference::wasm_uint64_div(jsgraph()->isolate()), |
- MachineType::Int64(), kTrapDivByZero); |
+ MachineType::Int64(), wasm::kTrapDivByZero); |
} |
return graph()->NewNode(jsgraph()->machine()->Uint64Div(), left, right, |
- trap_->ZeroCheck64(kTrapDivByZero, right)); |
+ trap_->ZeroCheck64(wasm::kTrapDivByZero, right)); |
} |
Node* WasmGraphBuilder::BuildI64RemU(Node* left, Node* right) { |
if (jsgraph()->machine()->Is32()) { |
return BuildDiv64Call( |
left, right, ExternalReference::wasm_uint64_mod(jsgraph()->isolate()), |
- MachineType::Int64(), kTrapRemByZero); |
+ MachineType::Int64(), wasm::kTrapRemByZero); |
} |
return graph()->NewNode(jsgraph()->machine()->Uint64Mod(), left, right, |
- trap_->ZeroCheck64(kTrapRemByZero, right)); |
+ trap_->ZeroCheck64(wasm::kTrapRemByZero, right)); |
} |
Node* WasmGraphBuilder::BuildDiv64Call(Node* left, Node* right, |
@@ -1966,8 +1946,8 @@ Node* WasmGraphBuilder::BuildDiv64Call(Node* left, Node* right, |
// TODO(wasm): This can get simpler if we have a specialized runtime call to |
// throw WASM exceptions by trap code instead of by string. |
- trap_->ZeroCheck32(static_cast<TrapReason>(trap_zero), call); |
- trap_->TrapIfEq32(kTrapDivUnrepresentable, call, -1); |
+ trap_->ZeroCheck32(static_cast<wasm::TrapReason>(trap_zero), call); |
+ trap_->TrapIfEq32(wasm::kTrapDivUnrepresentable, call, -1); |
const Operator* load_op = jsgraph()->machine()->Load(result_type); |
Node* load = |
graph()->NewNode(load_op, stack_slot_dst, jsgraph()->Int32Constant(0), |
@@ -2053,10 +2033,10 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t index, Node** args) { |
// Bounds check against the table size. |
Node* size = Int32Constant(static_cast<int>(table_size)); |
Node* in_bounds = graph()->NewNode(machine->Uint32LessThan(), key, size); |
- trap_->AddTrapIfFalse(kTrapFuncInvalid, in_bounds); |
+ trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, in_bounds); |
} else { |
// No function table. Generate a trap and return a constant. |
- trap_->AddTrapIfFalse(kTrapFuncInvalid, Int32Constant(0)); |
+ trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, Int32Constant(0)); |
return trap_->GetTrapValue(module_->GetSignature(index)); |
} |
Node* table = FunctionTable(); |
@@ -2076,7 +2056,7 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t index, Node** args) { |
*effect_, *control_); |
Node* sig_match = graph()->NewNode(machine->WordEqual(), load_sig, |
jsgraph()->SmiConstant(index)); |
- trap_->AddTrapIfFalse(kTrapFuncSigMismatch, sig_match); |
+ trap_->AddTrapIfFalse(wasm::kTrapFuncSigMismatch, sig_match); |
} |
// Load code object from the table. |
@@ -2395,7 +2375,7 @@ void WasmGraphBuilder::BoundsCheckMem(MachineType memtype, Node* index, |
jsgraph()->Int32Constant(static_cast<uint32_t>(limit))); |
} |
- trap_->AddTrapIfFalse(kTrapMemOutOfBounds, cond); |
+ trap_->AddTrapIfFalse(wasm::kTrapMemOutOfBounds, cond); |
} |