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 <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
10 | 10 |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 } | 340 } |
341 }; | 341 }; |
342 | 342 |
343 WasmGraphBuilder::WasmGraphBuilder( | 343 WasmGraphBuilder::WasmGraphBuilder( |
344 wasm::ModuleEnv* module_env, Zone* zone, JSGraph* jsgraph, | 344 wasm::ModuleEnv* module_env, Zone* zone, JSGraph* jsgraph, |
345 wasm::FunctionSig* sig, | 345 wasm::FunctionSig* sig, |
346 compiler::SourcePositionTable* source_position_table) | 346 compiler::SourcePositionTable* source_position_table) |
347 : zone_(zone), | 347 : zone_(zone), |
348 jsgraph_(jsgraph), | 348 jsgraph_(jsgraph), |
349 module_(module_env), | 349 module_(module_env), |
| 350 signature_tables_(zone), |
350 function_tables_(zone), | 351 function_tables_(zone), |
351 function_table_sizes_(zone), | 352 function_table_sizes_(zone), |
352 cur_buffer_(def_buffer_), | 353 cur_buffer_(def_buffer_), |
353 cur_bufsize_(kDefaultBufferSize), | 354 cur_bufsize_(kDefaultBufferSize), |
354 trap_(new (zone) WasmTrapHelper(this)), | 355 trap_(new (zone) WasmTrapHelper(this)), |
355 sig_(sig), | 356 sig_(sig), |
356 source_position_table_(source_position_table) { | 357 source_position_table_(source_position_table) { |
357 for (size_t i = 0; i < sig->parameter_count(); i++) { | 358 for (size_t i = 0; i < sig->parameter_count(); i++) { |
358 if (sig->GetParam(i) == wasm::kWasmS128) has_simd_ = true; | 359 if (sig->GetParam(i) == wasm::kWasmS128) has_simd_ = true; |
359 } | 360 } |
(...skipping 1938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2298 | 2299 |
2299 EnsureFunctionTableNodes(); | 2300 EnsureFunctionTableNodes(); |
2300 MachineOperatorBuilder* machine = jsgraph()->machine(); | 2301 MachineOperatorBuilder* machine = jsgraph()->machine(); |
2301 Node* key = args[0]; | 2302 Node* key = args[0]; |
2302 | 2303 |
2303 // Bounds check against the table size. | 2304 // Bounds check against the table size. |
2304 Node* size = function_table_sizes_[table_index]; | 2305 Node* size = function_table_sizes_[table_index]; |
2305 Node* in_bounds = graph()->NewNode(machine->Uint32LessThan(), key, size); | 2306 Node* in_bounds = graph()->NewNode(machine->Uint32LessThan(), key, size); |
2306 trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, in_bounds, position); | 2307 trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, in_bounds, position); |
2307 Node* table = function_tables_[table_index]; | 2308 Node* table = function_tables_[table_index]; |
| 2309 Node* signatures = signature_tables_[table_index]; |
2308 | 2310 |
2309 // Load signature from the table and check. | 2311 // Load signature from the table and check. |
2310 // The table is a FixedArray; signatures are encoded as SMIs. | 2312 // The table is a FixedArray; signatures are encoded as SMIs. |
2311 // [sig1, sig2, sig3, ...., code1, code2, code3 ...] | 2313 // [sig1, sig2, sig3, ...., code1, code2, code3 ...] |
2312 ElementAccess access = AccessBuilder::ForFixedArrayElement(); | 2314 ElementAccess access = AccessBuilder::ForFixedArrayElement(); |
2313 const int fixed_offset = access.header_size - access.tag(); | 2315 const int fixed_offset = access.header_size - access.tag(); |
2314 { | 2316 { |
2315 Node* load_sig = graph()->NewNode( | 2317 Node* load_sig = graph()->NewNode( |
2316 machine->Load(MachineType::AnyTagged()), table, | 2318 machine->Load(MachineType::AnyTagged()), signatures, |
2317 graph()->NewNode(machine->Int32Add(), | 2319 graph()->NewNode(machine->Int32Add(), |
2318 graph()->NewNode(machine->Word32Shl(), key, | 2320 graph()->NewNode(machine->Word32Shl(), key, |
2319 Int32Constant(kPointerSizeLog2)), | 2321 Int32Constant(kPointerSizeLog2)), |
2320 Int32Constant(fixed_offset)), | 2322 Int32Constant(fixed_offset)), |
2321 *effect_, *control_); | 2323 *effect_, *control_); |
2322 auto map = const_cast<wasm::SignatureMap&>( | 2324 auto map = const_cast<wasm::SignatureMap&>( |
2323 module_->module->function_tables[0].map); | 2325 module_->module->function_tables[0].map); |
2324 Node* sig_match = graph()->NewNode( | 2326 Node* sig_match = graph()->NewNode( |
2325 machine->WordEqual(), load_sig, | 2327 machine->WordEqual(), load_sig, |
2326 jsgraph()->SmiConstant(static_cast<int>(map.FindOrInsert(sig)))); | 2328 jsgraph()->SmiConstant(static_cast<int>(map.FindOrInsert(sig)))); |
2327 trap_->AddTrapIfFalse(wasm::kTrapFuncSigMismatch, sig_match, position); | 2329 trap_->AddTrapIfFalse(wasm::kTrapFuncSigMismatch, sig_match, position); |
2328 } | 2330 } |
2329 | 2331 |
2330 // Load code object from the table. | 2332 // Load code object from the table. |
2331 uint32_t table_size = module_->module->function_tables[table_index].min_size; | |
2332 uint32_t offset = fixed_offset + kPointerSize * table_size; | |
2333 Node* load_code = graph()->NewNode( | 2333 Node* load_code = graph()->NewNode( |
2334 machine->Load(MachineType::AnyTagged()), table, | 2334 machine->Load(MachineType::AnyTagged()), table, |
2335 graph()->NewNode(machine->Int32Add(), | 2335 graph()->NewNode(machine->Int32Add(), |
2336 graph()->NewNode(machine->Word32Shl(), key, | 2336 graph()->NewNode(machine->Word32Shl(), key, |
2337 Int32Constant(kPointerSizeLog2)), | 2337 Int32Constant(kPointerSizeLog2)), |
2338 Uint32Constant(offset)), | 2338 Uint32Constant(fixed_offset)), |
2339 *effect_, *control_); | 2339 *effect_, *control_); |
2340 | 2340 |
2341 args[0] = load_code; | 2341 args[0] = load_code; |
2342 return BuildWasmCall(sig, args, rets, position); | 2342 return BuildWasmCall(sig, args, rets, position); |
2343 } | 2343 } |
2344 | 2344 |
2345 Node* WasmGraphBuilder::BuildI32Rol(Node* left, Node* right) { | 2345 Node* WasmGraphBuilder::BuildI32Rol(Node* left, Node* right) { |
2346 // Implement Rol by Ror since TurboFan does not have Rol opcode. | 2346 // Implement Rol by Ror since TurboFan does not have Rol opcode. |
2347 // TODO(weiliang): support Word32Rol opcode in TurboFan. | 2347 // TODO(weiliang): support Word32Rol opcode in TurboFan. |
2348 Int32Matcher m(right); | 2348 Int32Matcher m(right); |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2960 size, RelocInfo::WASM_MEMORY_SIZE_REFERENCE); | 2960 size, RelocInfo::WASM_MEMORY_SIZE_REFERENCE); |
2961 return mem_size_; | 2961 return mem_size_; |
2962 } else { | 2962 } else { |
2963 return jsgraph()->RelocatableInt32Constant( | 2963 return jsgraph()->RelocatableInt32Constant( |
2964 size + offset, RelocInfo::WASM_MEMORY_SIZE_REFERENCE); | 2964 size + offset, RelocInfo::WASM_MEMORY_SIZE_REFERENCE); |
2965 } | 2965 } |
2966 } | 2966 } |
2967 | 2967 |
2968 void WasmGraphBuilder::EnsureFunctionTableNodes() { | 2968 void WasmGraphBuilder::EnsureFunctionTableNodes() { |
2969 if (function_tables_.size() > 0) return; | 2969 if (function_tables_.size() > 0) return; |
2970 for (size_t i = 0; i < module_->instance->function_tables.size(); ++i) { | 2970 size_t tables_size = module_->instance->function_tables.size(); |
2971 auto handle = module_->instance->function_tables[i]; | 2971 DCHECK(tables_size == module_->instance->signature_tables.size()); |
2972 DCHECK(!handle.is_null()); | 2972 for (size_t i = 0; i < tables_size; ++i) { |
2973 function_tables_.push_back(HeapConstant(handle)); | 2973 auto function_handle = module_->instance->function_tables[i]; |
| 2974 auto signature_handle = module_->instance->signature_tables[i]; |
| 2975 DCHECK(!function_handle.is_null() && !signature_handle.is_null()); |
| 2976 function_tables_.push_back(HeapConstant(function_handle)); |
| 2977 signature_tables_.push_back(HeapConstant(signature_handle)); |
2974 uint32_t table_size = module_->module->function_tables[i].min_size; | 2978 uint32_t table_size = module_->module->function_tables[i].min_size; |
2975 function_table_sizes_.push_back(Uint32Constant(table_size)); | 2979 function_table_sizes_.push_back(jsgraph()->RelocatableInt32Constant( |
| 2980 static_cast<uint32_t>(table_size), |
| 2981 RelocInfo::WASM_FUNCTION_TABLE_SIZE_REFERENCE)); |
2976 } | 2982 } |
2977 } | 2983 } |
2978 | 2984 |
2979 Node* WasmGraphBuilder::GetGlobal(uint32_t index) { | 2985 Node* WasmGraphBuilder::GetGlobal(uint32_t index) { |
2980 MachineType mem_type = | 2986 MachineType mem_type = |
2981 wasm::WasmOpcodes::MachineTypeFor(module_->GetGlobalType(index)); | 2987 wasm::WasmOpcodes::MachineTypeFor(module_->GetGlobalType(index)); |
2982 Node* addr = jsgraph()->RelocatableIntPtrConstant( | 2988 Node* addr = jsgraph()->RelocatableIntPtrConstant( |
2983 reinterpret_cast<uintptr_t>(module_->instance->globals_start + | 2989 reinterpret_cast<uintptr_t>(module_->instance->globals_start + |
2984 module_->module->globals[index].offset), | 2990 module_->module->globals[index].offset), |
2985 RelocInfo::WASM_GLOBAL_REFERENCE); | 2991 RelocInfo::WASM_GLOBAL_REFERENCE); |
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3686 Smi::FromInt(instruction.instr_offset)); | 3692 Smi::FromInt(instruction.instr_offset)); |
3687 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, | 3693 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, |
3688 Smi::FromInt(instruction.landing_offset)); | 3694 Smi::FromInt(instruction.landing_offset)); |
3689 } | 3695 } |
3690 return fn_protected; | 3696 return fn_protected; |
3691 } | 3697 } |
3692 | 3698 |
3693 } // namespace compiler | 3699 } // namespace compiler |
3694 } // namespace internal | 3700 } // namespace internal |
3695 } // namespace v8 | 3701 } // namespace v8 |
OLD | NEW |