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; |
} |
}; |