Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(625)

Unified Diff: src/compiler/wasm-compiler.cc

Issue 2174123002: [wasm] Add support for multiple indirect function tables (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix GC issue Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | src/wasm/module-decoder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/wasm-compiler.cc
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
index 74839ad5df01324d5a7d0725bd799210fee6a0dc..71f450f0743cc6ba6a2d6bdafb2d1e8cab77064d 100644
--- a/src/compiler/wasm-compiler.cc
+++ b/src/compiler/wasm-compiler.cc
@@ -278,7 +278,7 @@ WasmGraphBuilder::WasmGraphBuilder(
module_(nullptr),
mem_buffer_(nullptr),
mem_size_(nullptr),
- function_table_(nullptr),
+ function_tables_(zone),
control_(nullptr),
effect_(nullptr),
cur_buffer_(def_buffer_),
@@ -2059,11 +2059,14 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t index, Node** args,
// Compute the code object by loading it from the function table.
Node* key = args[0];
+ // Assume only one table for now.
+ DCHECK_LE(module_->instance->function_tables.size(), 1u);
// Bounds check the index.
- int table_size = static_cast<int>(module_->FunctionTableSize());
+ uint32_t table_size =
+ module_->IsValidTable(0) ? module_->GetTable(0)->max_size : 0;
if (table_size > 0) {
// Bounds check against the table size.
- Node* size = Int32Constant(static_cast<int>(table_size));
+ Node* size = Uint32Constant(table_size);
Node* in_bounds = graph()->NewNode(machine->Uint32LessThan(), key, size);
trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, in_bounds, position);
} else {
@@ -2071,7 +2074,7 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t index, Node** args,
trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, Int32Constant(0), position);
return trap_->GetTrapValue(module_->GetSignature(index));
}
- Node* table = FunctionTable();
+ Node* table = FunctionTable(0);
// Load signature from the table and check.
// The table is a FixedArray; signatures are encoded as SMIs.
@@ -2093,13 +2096,13 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t index, Node** args,
}
// Load code object from the table.
- int offset = fixed_offset + kPointerSize * table_size;
+ uint32_t offset = fixed_offset + kPointerSize * table_size;
Node* load_code = graph()->NewNode(
machine->Load(MachineType::AnyTagged()), table,
graph()->NewNode(machine->Int32Add(),
graph()->NewNode(machine->Word32Shl(), key,
Int32Constant(kPointerSizeLog2)),
- Int32Constant(offset)),
+ Uint32Constant(offset)),
*effect_, *control_);
args[0] = load_code;
@@ -2131,10 +2134,13 @@ Node* WasmGraphBuilder::JITSingleFunction(Node* const base, Node* const length,
// Bounds check the index.
{
- int table_size = static_cast<int>(module_->FunctionTableSize());
+ // Assume only one table for now.
+ DCHECK_LE(module_->instance->function_tables.size(), 1u);
+ uint32_t table_size =
+ module_->IsValidTable(0) ? module_->GetTable(0)->max_size : 0;
if (table_size > 0) {
// Bounds check against the table size.
- Node* size = Int32Constant(static_cast<int>(table_size));
+ Node* size = Uint32Constant(table_size);
Node* in_bounds =
graph()->NewNode(machine->Uint32LessThan(), index, size);
trap_->AddTrapIfFalse(wasm::kTrapInvalidIndex, in_bounds, position);
@@ -2164,7 +2170,7 @@ Node* WasmGraphBuilder::JITSingleFunction(Node* const base, Node* const length,
inputs[1] = BuildChangeUint32ToSmi(base);
inputs[2] = BuildChangeUint32ToSmi(length);
inputs[3] = BuildChangeUint32ToSmi(index);
- inputs[4] = FunctionTable();
+ inputs[4] = FunctionTable(0);
inputs[5] = Uint32Constant(sig_index);
inputs[6] = BuildChangeUint32ToSmi(Uint32Constant(return_count));
@@ -2806,13 +2812,17 @@ Node* WasmGraphBuilder::DefaultS128Value() {
zero, zero);
}
-Node* WasmGraphBuilder::FunctionTable() {
+Node* WasmGraphBuilder::FunctionTable(uint32_t index) {
DCHECK(module_ && module_->instance &&
- !module_->instance->function_table.is_null());
- if (!function_table_) {
- function_table_ = HeapConstant(module_->instance->function_table);
+ index < module_->instance->function_tables.size());
+ if (!function_tables_.size()) {
+ for (size_t i = 0; i < module_->instance->function_tables.size(); ++i) {
+ DCHECK(!module_->instance->function_tables[i].is_null());
+ function_tables_.push_back(
+ HeapConstant(module_->instance->function_tables[i]));
+ }
}
- return function_table_;
+ return function_tables_[index];
}
Node* WasmGraphBuilder::ChangeToRuntimeCall(Node* node,
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | src/wasm/module-decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698