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 "src/isolate-inl.h" | 7 #include "src/isolate-inl.h" |
8 | 8 |
9 #include "src/base/platform/elapsed-timer.h" | 9 #include "src/base/platform/elapsed-timer.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 2553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2564 StoreRepresentation(mem_type.representation(), kNoWriteBarrier)); | 2564 StoreRepresentation(mem_type.representation(), kNoWriteBarrier)); |
2565 Node* node = graph()->NewNode(op, addr, jsgraph()->Int32Constant(0), val, | 2565 Node* node = graph()->NewNode(op, addr, jsgraph()->Int32Constant(0), val, |
2566 *effect_, *control_); | 2566 *effect_, *control_); |
2567 *effect_ = node; | 2567 *effect_ = node; |
2568 return node; | 2568 return node; |
2569 } | 2569 } |
2570 | 2570 |
2571 void WasmGraphBuilder::BoundsCheckMem(MachineType memtype, Node* index, | 2571 void WasmGraphBuilder::BoundsCheckMem(MachineType memtype, Node* index, |
2572 uint32_t offset, | 2572 uint32_t offset, |
2573 wasm::WasmCodePosition position) { | 2573 wasm::WasmCodePosition position) { |
2574 // TODO(turbofan): fold bounds checks for constant indexes. | |
2575 DCHECK(module_ && module_->instance); | 2574 DCHECK(module_ && module_->instance); |
2576 size_t size = module_->instance->mem_size; | 2575 size_t size = module_->instance->mem_size; |
2577 byte memsize = wasm::WasmOpcodes::MemSize(memtype); | 2576 byte memsize = wasm::WasmOpcodes::MemSize(memtype); |
2578 Node* cond; | 2577 |
2579 if (offset >= size || (static_cast<uint64_t>(offset) + memsize) > size) { | 2578 if (offset >= size || (static_cast<uint64_t>(offset) + memsize) > size) { |
2580 // The access will always throw. | 2579 // The access will always throw (unless memory is grown). |
2581 cond = jsgraph()->Int32Constant(0); | 2580 Node* cond = jsgraph()->Int32Constant(0); |
2582 } else { | 2581 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
| |
2583 // Check against the limit. | 2582 return; |
2584 size_t limit = size - offset - memsize; | |
2585 CHECK(limit <= kMaxUInt32); | |
2586 cond = graph()->NewNode( | |
2587 jsgraph()->machine()->Uint32LessThanOrEqual(), index, | |
2588 jsgraph()->Int32Constant(static_cast<uint32_t>(limit))); | |
2589 } | 2583 } |
2590 | 2584 |
2585 // Check against the effective size. | |
2586 size_t effective_size = size - offset - memsize; | |
2587 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
| |
2588 | |
2589 Uint32Matcher m(index); | |
2590 if (m.HasValue()) { | |
2591 uint32_t value = m.Value(); | |
2592 if (value <= effective_size) { | |
2593 // The bounds check will always succeed. | |
2594 return; | |
2595 } | |
2596 } | |
2597 | |
2598 Node* cond = graph()->NewNode( | |
2599 jsgraph()->machine()->Uint32LessThanOrEqual(), index, | |
2600 jsgraph()->Int32Constant(static_cast<uint32_t>(effective_size))); | |
2601 | |
2591 trap_->AddTrapIfFalse(wasm::kTrapMemOutOfBounds, cond, position); | 2602 trap_->AddTrapIfFalse(wasm::kTrapMemOutOfBounds, cond, position); |
2592 } | 2603 } |
2593 | 2604 |
2594 Node* WasmGraphBuilder::LoadMem(wasm::LocalType type, MachineType memtype, | 2605 Node* WasmGraphBuilder::LoadMem(wasm::LocalType type, MachineType memtype, |
2595 Node* index, uint32_t offset, | 2606 Node* index, uint32_t offset, |
2596 wasm::WasmCodePosition position) { | 2607 wasm::WasmCodePosition position) { |
2597 Node* load; | 2608 Node* load; |
2598 | 2609 |
2599 if (module_ && module_->asm_js()) { | 2610 if (module_ && module_->asm_js()) { |
2600 // asm.js semantics use CheckedLoad (i.e. OOB reads return 0ish). | 2611 // asm.js semantics use CheckedLoad (i.e. OOB reads return 0ish). |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3072 const wasm::WasmFunction* function) { | 3083 const wasm::WasmFunction* function) { |
3073 WasmCompilationUnit* unit = | 3084 WasmCompilationUnit* unit = |
3074 CreateWasmCompilationUnit(thrower, isolate, module_env, function, 0); | 3085 CreateWasmCompilationUnit(thrower, isolate, module_env, function, 0); |
3075 ExecuteCompilation(unit); | 3086 ExecuteCompilation(unit); |
3076 return FinishCompilation(unit); | 3087 return FinishCompilation(unit); |
3077 } | 3088 } |
3078 | 3089 |
3079 } // namespace compiler | 3090 } // namespace compiler |
3080 } // namespace internal | 3091 } // namespace internal |
3081 } // namespace v8 | 3092 } // namespace v8 |
OLD | NEW |