Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index fa9f9588801cb30763f20174bec67d05f000b99d..b543c80e5722fc7828a65e019371359e0d8a1f01 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -2571,23 +2571,34 @@ Node* WasmGraphBuilder::StoreGlobal(uint32_t index, Node* val) { |
void WasmGraphBuilder::BoundsCheckMem(MachineType memtype, Node* index, |
uint32_t offset, |
wasm::WasmCodePosition position) { |
- // TODO(turbofan): fold bounds checks for constant indexes. |
DCHECK(module_ && module_->instance); |
size_t size = module_->instance->mem_size; |
byte memsize = wasm::WasmOpcodes::MemSize(memtype); |
- Node* cond; |
+ |
if (offset >= size || (static_cast<uint64_t>(offset) + memsize) > size) { |
- // The access will always throw. |
- cond = jsgraph()->Int32Constant(0); |
- } else { |
- // Check against the limit. |
- size_t limit = size - offset - memsize; |
- CHECK(limit <= kMaxUInt32); |
- cond = graph()->NewNode( |
- jsgraph()->machine()->Uint32LessThanOrEqual(), index, |
- jsgraph()->Int32Constant(static_cast<uint32_t>(limit))); |
+ // The access will always throw (unless memory is grown). |
+ Node* cond = jsgraph()->Int32Constant(0); |
+ trap_->AddTrapIfFalse(wasm::kTrapMemOutOfBounds, cond, position); |
Clemens Hammacher
2016/05/09 08:32:31
Why not trap_->TrapAlways?
titzer
2016/05/09 08:38:17
Yes, that would be great, but the nodes that will
|
+ return; |
} |
+ // Check against the effective size. |
+ size_t effective_size = size - offset - memsize; |
+ CHECK(effective_size <= kMaxUInt32); |
Clemens Hammacher
2016/05/09 08:32:31
Wouldn't a DCHECK suffice here?
titzer
2016/05/09 08:38:17
I really, really, don't want to wrap around in pro
Clemens Hammacher
2016/05/09 08:47:40
It really should not be possible here, since (offs
|
+ |
+ Uint32Matcher m(index); |
+ if (m.HasValue()) { |
+ uint32_t value = m.Value(); |
+ if (value <= effective_size) { |
+ // The bounds check will always succeed. |
+ return; |
+ } |
+ } |
+ |
+ Node* cond = graph()->NewNode( |
+ jsgraph()->machine()->Uint32LessThanOrEqual(), index, |
+ jsgraph()->Int32Constant(static_cast<uint32_t>(effective_size))); |
+ |
trap_->AddTrapIfFalse(wasm::kTrapMemOutOfBounds, cond, position); |
} |