[wasm] Rename index to sig_index in CallIndirectOperand

It took me a while to understand that the {index} is actually a
signature index. This CL changes the name to {sig_index} to make this
more clear.

Drive-by: Fix a CHECK to check the canonical signature index instead of
the original index. This ensures that there is a canonical signature
index in the signature map.
Drive-by^2: Un-templatize a method.

R=titzer@chromium.org

Change-Id: Ifdaec59806c4d5c976170807596503d2874f04e4
Reviewed-on: https://chromium-review.googlesource.com/871190
Reviewed-by: Ben Titzer <titzer@chromium.org>
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#50695}
This commit is contained in:
Clemens Hammacher 2018-01-17 19:53:30 +01:00 committed by Commit Bot
parent 0484e1f9ca
commit 478bfc91cd
5 changed files with 19 additions and 20 deletions

View File

@ -2543,7 +2543,7 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t sig_index, Node** args,
Int32Constant(fixed_offset)), Int32Constant(fixed_offset)),
*effect_, *control_); *effect_, *control_);
int32_t canonical_sig_num = env_->module->signature_ids[sig_index]; int32_t canonical_sig_num = env_->module->signature_ids[sig_index];
CHECK_GE(sig_index, 0); CHECK_GE(canonical_sig_num, 0);
Node* sig_match = graph()->NewNode(machine->WordEqual(), load_sig, Node* sig_match = graph()->NewNode(machine->WordEqual(), load_sig,
jsgraph()->SmiConstant(canonical_sig_num)); jsgraph()->SmiConstant(canonical_sig_num));
TrapIfFalse(wasm::kTrapFuncSigMismatch, sig_match, position); TrapIfFalse(wasm::kTrapFuncSigMismatch, sig_match, position);

View File

@ -246,12 +246,12 @@ struct BreakDepthOperand {
template <Decoder::ValidateFlag validate> template <Decoder::ValidateFlag validate>
struct CallIndirectOperand { struct CallIndirectOperand {
uint32_t table_index; uint32_t table_index;
uint32_t index; uint32_t sig_index;
FunctionSig* sig = nullptr; FunctionSig* sig = nullptr;
unsigned length = 0; unsigned length = 0;
inline CallIndirectOperand(Decoder* decoder, const byte* pc) { inline CallIndirectOperand(Decoder* decoder, const byte* pc) {
unsigned len = 0; unsigned len = 0;
index = decoder->read_u32v<validate>(pc + 1, &len, "signature index"); sig_index = decoder->read_u32v<validate>(pc + 1, &len, "signature index");
if (!VALIDATE(decoder->ok())) return; if (!VALIDATE(decoder->ok())) return;
table_index = decoder->read_u8<validate>(pc + 1 + len, "table index"); table_index = decoder->read_u8<validate>(pc + 1 + len, "table index");
if (!VALIDATE(table_index == 0)) { if (!VALIDATE(table_index == 0)) {
@ -789,10 +789,10 @@ class WasmDecoder : public Decoder {
inline bool Complete(const byte* pc, CallIndirectOperand<validate>& operand) { inline bool Complete(const byte* pc, CallIndirectOperand<validate>& operand) {
if (!VALIDATE(module_ != nullptr && if (!VALIDATE(module_ != nullptr &&
operand.index < module_->signatures.size())) { operand.sig_index < module_->signatures.size())) {
return false; return false;
} }
operand.sig = module_->signatures[operand.index]; operand.sig = module_->signatures[operand.sig_index];
return true; return true;
} }
@ -802,7 +802,7 @@ class WasmDecoder : public Decoder {
return false; return false;
} }
if (!Complete(pc, operand)) { if (!Complete(pc, operand)) {
errorf(pc + 1, "invalid signature index: #%u", operand.index); errorf(pc + 1, "invalid signature index: #%u", operand.sig_index);
return false; return false;
} }
return true; return true;

View File

@ -369,13 +369,13 @@ class WasmGraphBuildingInterface {
void CallDirect(Decoder* decoder, void CallDirect(Decoder* decoder,
const CallFunctionOperand<validate>& operand, const CallFunctionOperand<validate>& operand,
const Value args[], Value returns[]) { const Value args[], Value returns[]) {
DoCall(decoder, nullptr, operand, args, returns, false); DoCall(decoder, nullptr, operand.sig, operand.index, args, returns);
} }
void CallIndirect(Decoder* decoder, const Value& index, void CallIndirect(Decoder* decoder, const Value& index,
const CallIndirectOperand<validate>& operand, const CallIndirectOperand<validate>& operand,
const Value args[], Value returns[]) { const Value args[], Value returns[]) {
DoCall(decoder, index.node, operand, args, returns, true); DoCall(decoder, index.node, operand.sig, operand.sig_index, args, returns);
} }
void SimdOp(Decoder* decoder, WasmOpcode opcode, Vector<Value> args, void SimdOp(Decoder* decoder, WasmOpcode opcode, Vector<Value> args,
@ -782,30 +782,29 @@ class WasmGraphBuildingInterface {
return result; return result;
} }
template <typename Operand>
void DoCall(WasmFullDecoder<validate, WasmGraphBuildingInterface>* decoder, void DoCall(WasmFullDecoder<validate, WasmGraphBuildingInterface>* decoder,
TFNode* index_node, const Operand& operand, const Value args[], TFNode* index_node, FunctionSig* sig, uint32_t index,
Value returns[], bool is_indirect) { const Value args[], Value returns[]) {
int param_count = static_cast<int>(operand.sig->parameter_count()); int param_count = static_cast<int>(sig->parameter_count());
TFNode** arg_nodes = builder_->Buffer(param_count + 1); TFNode** arg_nodes = builder_->Buffer(param_count + 1);
TFNode** return_nodes = nullptr; TFNode** return_nodes = nullptr;
arg_nodes[0] = index_node; arg_nodes[0] = index_node;
for (int i = 0; i < param_count; ++i) { for (int i = 0; i < param_count; ++i) {
arg_nodes[i + 1] = args[i].node; arg_nodes[i + 1] = args[i].node;
} }
if (is_indirect) { if (index_node) {
builder_->CallIndirect(operand.index, arg_nodes, &return_nodes, builder_->CallIndirect(index, arg_nodes, &return_nodes,
decoder->position()); decoder->position());
} else { } else {
builder_->CallDirect(operand.index, arg_nodes, &return_nodes, builder_->CallDirect(index, arg_nodes, &return_nodes,
decoder->position()); decoder->position());
} }
int return_count = static_cast<int>(operand.sig->return_count()); int return_count = static_cast<int>(sig->return_count());
for (int i = 0; i < return_count; ++i) { for (int i = 0; i < return_count; ++i) {
returns[i].node = return_nodes[i]; returns[i].node = return_nodes[i];
} }
// The invoked function could have used grow_memory, so we need to // The invoked function could have used grow_memory, so we need to
// reload mem_size and mem_start // reload mem_size and mem_start.
LoadContextIntoSsa(ssa_env_); LoadContextIntoSsa(ssa_env_);
} }
}; };
@ -1002,7 +1001,7 @@ bool PrintRawWasmCode(AccountingAllocator* allocator, const FunctionBody& body,
} }
case kExprCallIndirect: { case kExprCallIndirect: {
CallIndirectOperand<Decoder::kNoValidate> operand(&i, i.pc()); CallIndirectOperand<Decoder::kNoValidate> operand(&i, i.pc());
os << " // sig #" << operand.index; os << " // sig #" << operand.sig_index;
if (decoder.Complete(i.pc(), operand)) { if (decoder.Complete(i.pc(), operand)) {
os << ": " << *operand.sig; os << ": " << *operand.sig;
} }

View File

@ -1934,7 +1934,7 @@ class ThreadImpl {
// Assume only one table for now. // Assume only one table for now.
DCHECK_LE(module()->function_tables.size(), 1u); DCHECK_LE(module()->function_tables.size(), 1u);
ExternalCallResult result = ExternalCallResult result =
CallIndirectFunction(0, entry_index, operand.index); CallIndirectFunction(0, entry_index, operand.sig_index);
switch (result.type) { switch (result.type) {
case ExternalCallResult::INTERNAL: case ExternalCallResult::INTERNAL:
// The import is a function of this instance. Call it directly. // The import is a function of this instance. Call it directly.

View File

@ -134,7 +134,7 @@ void PrintWasmText(const WasmModule* module, const ModuleWireBytes& wire_bytes,
case kExprCallIndirect: { case kExprCallIndirect: {
CallIndirectOperand<Decoder::kNoValidate> operand(&i, i.pc()); CallIndirectOperand<Decoder::kNoValidate> operand(&i, i.pc());
DCHECK_EQ(0, operand.table_index); DCHECK_EQ(0, operand.table_index);
os << "call_indirect " << operand.index; os << "call_indirect " << operand.sig_index;
break; break;
} }
case kExprCallFunction: { case kExprCallFunction: {