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