Chromium Code Reviews| Index: src/wasm/ast-decoder.cc |
| diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc |
| index 62026517a74605bc38bded99dcbdf6c7afb20d89..5981236faab6b78efc687e5a317e9cf8767e37f4 100644 |
| --- a/src/wasm/ast-decoder.cc |
| +++ b/src/wasm/ast-decoder.cc |
| @@ -718,8 +718,7 @@ class SR_WasmDecoder : public WasmDecoder { |
| break; |
| } |
| case kExprUnreachable: { |
| - // TODO(clemensh): add source position for unreachable |
| - BUILD0(Unreachable); |
| + BUILD(Unreachable, current_position()); |
| ssa_env_->Kill(SsaEnv::kControlEnd); |
| Leaf(kAstEnd, nullptr); |
| break; |
| @@ -792,7 +791,7 @@ class SR_WasmDecoder : public WasmDecoder { |
| case kExprI32LoadMem16S: |
| case kExprI32LoadMem16U: |
| case kExprI32LoadMem: |
| - len = DecodeLoadMem(pc_, kAstI32); |
| + len = DecodeLoadMem(kAstI32); |
| break; |
| case kExprI64LoadMem8S: |
| case kExprI64LoadMem8U: |
| @@ -801,30 +800,30 @@ class SR_WasmDecoder : public WasmDecoder { |
| case kExprI64LoadMem32S: |
| case kExprI64LoadMem32U: |
| case kExprI64LoadMem: |
| - len = DecodeLoadMem(pc_, kAstI64); |
| + len = DecodeLoadMem(kAstI64); |
| break; |
| case kExprF32LoadMem: |
| - len = DecodeLoadMem(pc_, kAstF32); |
| + len = DecodeLoadMem(kAstF32); |
| break; |
| case kExprF64LoadMem: |
| - len = DecodeLoadMem(pc_, kAstF64); |
| + len = DecodeLoadMem(kAstF64); |
| break; |
| case kExprI32StoreMem8: |
| case kExprI32StoreMem16: |
| case kExprI32StoreMem: |
| - len = DecodeStoreMem(pc_, kAstI32); |
| + len = DecodeStoreMem(kAstI32); |
| break; |
| case kExprI64StoreMem8: |
| case kExprI64StoreMem16: |
| case kExprI64StoreMem32: |
| case kExprI64StoreMem: |
| - len = DecodeStoreMem(pc_, kAstI64); |
| + len = DecodeStoreMem(kAstI64); |
| break; |
| case kExprF32StoreMem: |
| - len = DecodeStoreMem(pc_, kAstF32); |
| + len = DecodeStoreMem(kAstF32); |
| break; |
| case kExprF64StoreMem: |
| - len = DecodeStoreMem(pc_, kAstF64); |
| + len = DecodeStoreMem(kAstF64); |
| break; |
| case kExprMemorySize: |
| Leaf(kAstI32, BUILD(MemSize, 0)); |
| @@ -885,14 +884,14 @@ class SR_WasmDecoder : public WasmDecoder { |
| blocks_.push_back({ssa_env, static_cast<int>(stack_.size() - 1)}); |
| } |
| - int DecodeLoadMem(const byte* pc, LocalType type) { |
| - MemoryAccessOperand operand(this, pc); |
| + int DecodeLoadMem(LocalType type) { |
| + MemoryAccessOperand operand(this, pc_); |
| Shift(type, 1); |
| return 1 + operand.length; |
| } |
| - int DecodeStoreMem(const byte* pc, LocalType type) { |
| - MemoryAccessOperand operand(this, pc); |
| + int DecodeStoreMem(LocalType type) { |
| + MemoryAccessOperand operand(this, pc_); |
| Shift(type, 2); |
| return 1 + operand.length; |
| } |
| @@ -948,10 +947,12 @@ class SR_WasmDecoder : public WasmDecoder { |
| TypeCheckLast(p, sig->GetParam(p->index - 1)); |
| if (p->done() && build()) { |
| if (sig->parameter_count() == 2) { |
| - p->tree->node = builder_->Binop(opcode, p->tree->children[0]->node, |
| - p->tree->children[1]->node); |
| + p->tree->node = |
| + builder_->Binop(opcode, p->tree->children[0]->node, |
| + p->tree->children[1]->node, position(p)); |
| } else if (sig->parameter_count() == 1) { |
| - p->tree->node = builder_->Unop(opcode, p->tree->children[0]->node); |
| + p->tree->node = |
| + builder_->Unop(opcode, p->tree->children[0]->node, position(p)); |
| } else { |
| UNREACHABLE(); |
| } |
| @@ -1254,7 +1255,8 @@ class SR_WasmDecoder : public WasmDecoder { |
| for (uint32_t i = 0; i < count; i++) { |
| buffer[i] = p->tree->children[i]->node; |
| } |
| - p->tree->node = builder_->CallIndirect(operand.index, buffer); |
| + p->tree->node = |
| + builder_->CallIndirect(operand.index, buffer, position(p)); |
| AddSourcePosition(p); |
| } |
| break; |
| @@ -1327,8 +1329,8 @@ class SR_WasmDecoder : public WasmDecoder { |
| TypeCheckLast(p, kAstI32); // index |
| if (build()) { |
| MemoryAccessOperand operand(this, p->pc()); |
| - p->tree->node = |
| - builder_->LoadMem(type, mem_type, p->last()->node, operand.offset); |
| + p->tree->node = builder_->LoadMem(type, mem_type, p->last()->node, |
| + operand.offset, position(p)); |
| } |
| } |
| @@ -1342,7 +1344,7 @@ class SR_WasmDecoder : public WasmDecoder { |
| MemoryAccessOperand operand(this, p->pc()); |
| TFNode* val = p->tree->children[1]->node; |
| builder_->StoreMem(mem_type, p->tree->children[0]->node, operand.offset, |
| - val); |
| + val, position(p)); |
| p->tree->node = val; |
| } |
| } |
| @@ -1420,7 +1422,7 @@ class SR_WasmDecoder : public WasmDecoder { |
| builder_->AppendToMerge(merge, from->control); |
| // Merge effects. |
| if (builder_->IsPhiWithMerge(to->effect, merge)) { |
| - builder_->AppendToPhi(merge, to->effect, from->effect); |
| + builder_->AppendToPhi(to->effect, from->effect); |
| } else if (to->effect != from->effect) { |
| uint32_t count = builder_->InputCount(merge); |
| TFNode** effects = builder_->Buffer(count); |
| @@ -1435,7 +1437,7 @@ class SR_WasmDecoder : public WasmDecoder { |
| TFNode* tnode = to->locals[i]; |
| TFNode* fnode = from->locals[i]; |
| if (builder_->IsPhiWithMerge(tnode, merge)) { |
| - builder_->AppendToPhi(merge, tnode, fnode); |
| + builder_->AppendToPhi(tnode, fnode); |
| } else if (tnode != fnode) { |
| uint32_t count = builder_->InputCount(merge); |
| TFNode** vals = builder_->Buffer(count); |
| @@ -1458,7 +1460,7 @@ class SR_WasmDecoder : public WasmDecoder { |
| TFNode* CreateOrMergeIntoPhi(LocalType type, TFNode* merge, TFNode* tnode, |
| TFNode* fnode) { |
| if (builder_->IsPhiWithMerge(tnode, merge)) { |
| - builder_->AppendToPhi(merge, tnode, fnode); |
| + builder_->AppendToPhi(tnode, fnode); |
| } else if (tnode != fnode) { |
| uint32_t count = builder_->InputCount(merge); |
| TFNode** vals = builder_->Buffer(count); |
| @@ -1636,15 +1638,17 @@ class SR_WasmDecoder : public WasmDecoder { |
| return assigned; |
| } |
| - void AddSourcePosition(Production* p) { |
| + inline void AddSourcePosition(Production* p) { |
| DCHECK_NOT_NULL(p->tree->node); |
| - AddSourcePosition(p->tree->node, p->pc()); |
| + builder_->SetSourcePosition(p->tree->node, position(p)); |
| } |
| - void AddSourcePosition(TFNode* node, const byte* pc) { |
| + inline int current_position() { return position(pc_); } |
|
titzer
2016/04/28 11:27:00
Let's inline this one, since it's not actually sho
Clemens Hammacher
2016/04/28 12:43:28
.. and it just had one usage.
Done.
|
| + inline int position(Production* p) { return position(p->pc()); } |
| + inline int position(const byte* pc) { |
| int offset = static_cast<int>(pc - start_); |
| DCHECK_EQ(pc - start_, offset); // overflows cannot happen |
| - builder_->SetSourcePosition(node, offset); |
| + return offset; |
| } |
| }; |