| 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/assembler-inl.h" | 9 #include "src/assembler-inl.h" | 
| 10 #include "src/base/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" | 
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 172     return builder_->Control(); | 172     return builder_->Control(); | 
| 173   } | 173   } | 
| 174 | 174 | 
| 175   // Add a check that traps if {node} is zero. | 175   // Add a check that traps if {node} is zero. | 
| 176   Node* ZeroCheck64(wasm::TrapReason reason, Node* node, | 176   Node* ZeroCheck64(wasm::TrapReason reason, Node* node, | 
| 177                     wasm::WasmCodePosition position) { | 177                     wasm::WasmCodePosition position) { | 
| 178     return TrapIfEq64(reason, node, 0, position); | 178     return TrapIfEq64(reason, node, 0, position); | 
| 179   } | 179   } | 
| 180 | 180 | 
| 181   Builtins::Name GetBuiltinIdForTrap(wasm::TrapReason reason) { | 181   Builtins::Name GetBuiltinIdForTrap(wasm::TrapReason reason) { | 
| 182     if (builder_->module_ && !builder_->module_->instance->context.is_null()) { | 182     bool in_cctest = | 
| 183       switch (reason) { | 183         !builder_->module_ || builder_->module_->instance->context.is_null(); | 
| 184 #define TRAPREASON_TO_MESSAGE(name) \ | 184     if (in_cctest) { | 
| 185   case wasm::k##name:               \ | 185       // We use Builtins::builtin_count as a marker to tell the code generator | 
| 186     return Builtins::kThrowWasm##name; |  | 
| 187         FOREACH_WASM_TRAPREASON(TRAPREASON_TO_MESSAGE) |  | 
| 188 #undef TRAPREASON_TO_MESSAGE |  | 
| 189         default: |  | 
| 190           UNREACHABLE(); |  | 
| 191           return Builtins::builtin_count; |  | 
| 192       } |  | 
| 193     } else { |  | 
| 194       // We use Runtime::kNumFunctions as a marker to tell the code generator |  | 
| 195       // to generate a call to a testing c-function instead of a runtime | 186       // to generate a call to a testing c-function instead of a runtime | 
| 196       // function. This code should only be called from a cctest. | 187       // function. This code should only be called from a cctest. | 
| 197       return Builtins::builtin_count; | 188       return Builtins::builtin_count; | 
| 198     } | 189     } | 
|  | 190 | 
|  | 191     switch (reason) { | 
|  | 192 #define TRAPREASON_TO_MESSAGE(name) \ | 
|  | 193   case wasm::k##name:               \ | 
|  | 194     return Builtins::kThrowWasm##name; | 
|  | 195       FOREACH_WASM_TRAPREASON(TRAPREASON_TO_MESSAGE) | 
|  | 196 #undef TRAPREASON_TO_MESSAGE | 
|  | 197       default: | 
|  | 198         UNREACHABLE(); | 
|  | 199         return Builtins::builtin_count; | 
|  | 200     } | 
| 199   } | 201   } | 
| 200 | 202 | 
| 201 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM ||      \ | 203 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM ||      \ | 
| 202     V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || \ | 204     V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || \ | 
| 203     V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_S390 ||    \ | 205     V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_S390 ||    \ | 
| 204     V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_X87 | 206     V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_X87 | 
| 205 #define WASM_TRAP_IF_SUPPORTED | 207 #define WASM_TRAP_IF_SUPPORTED | 
| 206 #endif | 208 #endif | 
| 207 | 209 | 
| 208   // Add a trap if {cond} is true. | 210   // Add a trap if {cond} is true. | 
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 365       jsgraph_(jsgraph), | 367       jsgraph_(jsgraph), | 
| 366       module_(module_env), | 368       module_(module_env), | 
| 367       signature_tables_(zone), | 369       signature_tables_(zone), | 
| 368       function_tables_(zone), | 370       function_tables_(zone), | 
| 369       function_table_sizes_(zone), | 371       function_table_sizes_(zone), | 
| 370       cur_buffer_(def_buffer_), | 372       cur_buffer_(def_buffer_), | 
| 371       cur_bufsize_(kDefaultBufferSize), | 373       cur_bufsize_(kDefaultBufferSize), | 
| 372       trap_(new (zone) WasmTrapHelper(this)), | 374       trap_(new (zone) WasmTrapHelper(this)), | 
| 373       sig_(sig), | 375       sig_(sig), | 
| 374       source_position_table_(source_position_table) { | 376       source_position_table_(source_position_table) { | 
| 375   for (size_t i = 0; i < sig->parameter_count(); i++) { | 377   for (size_t i = sig->parameter_count(); i > 0 && !has_simd_; --i) { | 
| 376     if (sig->GetParam(i) == wasm::kWasmS128) has_simd_ = true; | 378     if (sig->GetParam(i - 1) == wasm::kWasmS128) has_simd_ = true; | 
| 377   } | 379   } | 
| 378   for (size_t i = 0; i < sig->return_count(); i++) { | 380   for (size_t i = sig->return_count(); i > 0 && !has_simd_; --i) { | 
| 379     if (sig->GetReturn(i) == wasm::kWasmS128) has_simd_ = true; | 381     if (sig->GetReturn(i - 1) == wasm::kWasmS128) has_simd_ = true; | 
| 380   } | 382   } | 
| 381   DCHECK_NOT_NULL(jsgraph_); | 383   DCHECK_NOT_NULL(jsgraph_); | 
| 382 } | 384 } | 
| 383 | 385 | 
| 384 Node* WasmGraphBuilder::Error() { return jsgraph()->Dead(); } | 386 Node* WasmGraphBuilder::Error() { return jsgraph()->Dead(); } | 
| 385 | 387 | 
| 386 Node* WasmGraphBuilder::Start(unsigned params) { | 388 Node* WasmGraphBuilder::Start(unsigned params) { | 
| 387   Node* start = graph()->NewNode(jsgraph()->common()->Start(params)); | 389   Node* start = graph()->NewNode(jsgraph()->common()->Start(params)); | 
| 388   graph()->SetStart(start); | 390   graph()->SetStart(start); | 
| 389   return start; | 391   return start; | 
| (...skipping 2667 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3057         RelocInfo::WASM_MEMORY_REFERENCE); | 3059         RelocInfo::WASM_MEMORY_REFERENCE); | 
| 3058   } | 3060   } | 
| 3059 } | 3061 } | 
| 3060 | 3062 | 
| 3061 Node* WasmGraphBuilder::CurrentMemoryPages() { | 3063 Node* WasmGraphBuilder::CurrentMemoryPages() { | 
| 3062   Runtime::FunctionId function_id = Runtime::kWasmMemorySize; | 3064   Runtime::FunctionId function_id = Runtime::kWasmMemorySize; | 
| 3063   const Runtime::Function* function = Runtime::FunctionForId(function_id); | 3065   const Runtime::Function* function = Runtime::FunctionForId(function_id); | 
| 3064   CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 3066   CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 
| 3065       jsgraph()->zone(), function_id, function->nargs, Operator::kNoThrow, | 3067       jsgraph()->zone(), function_id, function->nargs, Operator::kNoThrow, | 
| 3066       CallDescriptor::kNoFlags); | 3068       CallDescriptor::kNoFlags); | 
| 3067   wasm::ModuleEnv* module = module_; |  | 
| 3068   Node* inputs[] = { | 3069   Node* inputs[] = { | 
| 3069       jsgraph()->CEntryStubConstant(function->result_size),  // C entry | 3070       jsgraph()->CEntryStubConstant(function->result_size),  // C entry | 
| 3070       jsgraph()->ExternalConstant( | 3071       jsgraph()->ExternalConstant( | 
| 3071           ExternalReference(function_id, jsgraph()->isolate())),  // ref | 3072           ExternalReference(function_id, jsgraph()->isolate())),  // ref | 
| 3072       jsgraph()->Int32Constant(function->nargs),                  // arity | 3073       jsgraph()->Int32Constant(function->nargs),                  // arity | 
| 3073       jsgraph()->HeapConstant(module->instance->context),         // context | 3074       jsgraph()->HeapConstant(module_->instance->context),        // context | 
| 3074       *effect_, | 3075       *effect_, | 
| 3075       *control_}; | 3076       *control_}; | 
| 3076   Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), | 3077   Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), | 
| 3077                                 static_cast<int>(arraysize(inputs)), inputs); | 3078                                 static_cast<int>(arraysize(inputs)), inputs); | 
| 3078 | 3079 | 
| 3079   Node* result = BuildChangeSmiToInt32(call); | 3080   Node* result = BuildChangeSmiToInt32(call); | 
| 3080 | 3081 | 
| 3081   *effect_ = call; | 3082   *effect_ = call; | 
| 3082   return result; | 3083   return result; | 
| 3083 } | 3084 } | 
| (...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4165            function_->code_end_offset - function_->code_start_offset, | 4166            function_->code_end_offset - function_->code_start_offset, | 
| 4166            codegen_ms); | 4167            codegen_ms); | 
| 4167   } | 4168   } | 
| 4168 | 4169 | 
| 4169   return code; | 4170   return code; | 
| 4170 } | 4171 } | 
| 4171 | 4172 | 
| 4172 }  // namespace compiler | 4173 }  // namespace compiler | 
| 4173 }  // namespace internal | 4174 }  // namespace internal | 
| 4174 }  // namespace v8 | 4175 }  // namespace v8 | 
| OLD | NEW | 
|---|