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 "src/isolate-inl.h" | 7 #include "src/isolate-inl.h" |
8 | 8 |
9 #include "src/base/platform/elapsed-timer.h" | 9 #include "src/base/platform/elapsed-timer.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 if (traps_[reason] == nullptr) { | 186 if (traps_[reason] == nullptr) { |
187 // Create trap code for the first time this trap is used. | 187 // Create trap code for the first time this trap is used. |
188 return BuildTrapCode(reason); | 188 return BuildTrapCode(reason); |
189 } | 189 } |
190 // Connect the current control and effect to the existing trap code. | 190 // Connect the current control and effect to the existing trap code. |
191 builder_->AppendToMerge(traps_[reason], builder_->Control()); | 191 builder_->AppendToMerge(traps_[reason], builder_->Control()); |
192 builder_->AppendToPhi(traps_[reason], effects_[reason], builder_->Effect()); | 192 builder_->AppendToPhi(traps_[reason], effects_[reason], builder_->Effect()); |
193 } | 193 } |
194 | 194 |
195 void BuildTrapCode(wasm::TrapReason reason) { | 195 void BuildTrapCode(wasm::TrapReason reason) { |
196 Node* exception = | 196 Node* message_id = builder_->NumberConstant( |
197 builder_->String(wasm::WasmOpcodes::TrapReasonMessage(reason)); | 197 wasm::WasmOpcodes::TrapReasonToMessageId(reason)); |
198 Node* end; | 198 Node* end; |
199 Node** control_ptr = builder_->control_; | 199 Node** control_ptr = builder_->control_; |
200 Node** effect_ptr = builder_->effect_; | 200 Node** effect_ptr = builder_->effect_; |
201 wasm::ModuleEnv* module = builder_->module_; | 201 wasm::ModuleEnv* module = builder_->module_; |
| 202 DCHECK(traps_[reason] == NULL); |
202 *control_ptr = traps_[reason] = | 203 *control_ptr = traps_[reason] = |
203 graph()->NewNode(common()->Merge(1), *control_ptr); | 204 graph()->NewNode(common()->Merge(1), *control_ptr); |
204 *effect_ptr = effects_[reason] = | 205 *effect_ptr = effects_[reason] = |
205 graph()->NewNode(common()->EffectPhi(1), *effect_ptr, *control_ptr); | 206 graph()->NewNode(common()->EffectPhi(1), *effect_ptr, *control_ptr); |
206 | 207 |
207 if (module && !module->instance->context.is_null()) { | 208 if (module && !module->instance->context.is_null()) { |
208 // Use the module context to call the runtime to throw an exception. | 209 // Use the module context to call the runtime to throw an exception. |
209 Runtime::FunctionId f = Runtime::kThrow; | 210 Runtime::FunctionId f = Runtime::kThrowWasmError; |
210 const Runtime::Function* fun = Runtime::FunctionForId(f); | 211 const Runtime::Function* fun = Runtime::FunctionForId(f); |
211 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 212 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( |
212 jsgraph()->zone(), f, fun->nargs, Operator::kNoProperties, | 213 jsgraph()->zone(), f, fun->nargs, Operator::kNoProperties, |
213 CallDescriptor::kNoFlags); | 214 CallDescriptor::kNoFlags); |
214 Node* inputs[] = { | 215 Node* inputs[] = { |
215 jsgraph()->CEntryStubConstant(fun->result_size), // C entry | 216 jsgraph()->CEntryStubConstant(fun->result_size), // C entry |
216 exception, // exception | 217 message_id, // message id |
217 jsgraph()->ExternalConstant( | 218 jsgraph()->ExternalConstant( |
218 ExternalReference(f, jsgraph()->isolate())), // ref | 219 ExternalReference(f, jsgraph()->isolate())), // ref |
219 jsgraph()->Int32Constant(fun->nargs), // arity | 220 jsgraph()->Int32Constant(fun->nargs), // arity |
220 jsgraph()->Constant(module->instance->context), // context | 221 jsgraph()->Constant(module->instance->context), // context |
221 *effect_ptr, | 222 *effect_ptr, |
222 *control_ptr}; | 223 *control_ptr}; |
223 | 224 |
224 Node* node = graph()->NewNode( | 225 Node* node = graph()->NewNode( |
225 common()->Call(desc), static_cast<int>(arraysize(inputs)), inputs); | 226 common()->Call(desc), static_cast<int>(arraysize(inputs)), inputs); |
226 *control_ptr = node; | 227 *control_ptr = node; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 338 |
338 Node* WasmGraphBuilder::EffectPhi(unsigned count, Node** effects, | 339 Node* WasmGraphBuilder::EffectPhi(unsigned count, Node** effects, |
339 Node* control) { | 340 Node* control) { |
340 DCHECK(IrOpcode::IsMergeOpcode(control->opcode())); | 341 DCHECK(IrOpcode::IsMergeOpcode(control->opcode())); |
341 Node** buf = Realloc(effects, count, count + 1); | 342 Node** buf = Realloc(effects, count, count + 1); |
342 buf[count] = control; | 343 buf[count] = control; |
343 return graph()->NewNode(jsgraph()->common()->EffectPhi(count), count + 1, | 344 return graph()->NewNode(jsgraph()->common()->EffectPhi(count), count + 1, |
344 buf); | 345 buf); |
345 } | 346 } |
346 | 347 |
| 348 Node* WasmGraphBuilder::NumberConstant(int32_t value) { |
| 349 return jsgraph()->Constant(value); |
| 350 } |
347 | 351 |
348 Node* WasmGraphBuilder::Int32Constant(int32_t value) { | 352 Node* WasmGraphBuilder::Int32Constant(int32_t value) { |
349 return jsgraph()->Int32Constant(value); | 353 return jsgraph()->Int32Constant(value); |
350 } | 354 } |
351 | 355 |
352 | 356 |
353 Node* WasmGraphBuilder::Int64Constant(int64_t value) { | 357 Node* WasmGraphBuilder::Int64Constant(int64_t value) { |
354 return jsgraph()->Int64Constant(value); | 358 return jsgraph()->Int64Constant(value); |
355 } | 359 } |
356 | 360 |
(...skipping 2680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3037 // TODO(bradnelson): Improve histogram handling of size_t. | 3041 // TODO(bradnelson): Improve histogram handling of size_t. |
3038 isolate->counters()->wasm_compile_function_peak_memory_bytes()->AddSample( | 3042 isolate->counters()->wasm_compile_function_peak_memory_bytes()->AddSample( |
3039 static_cast<int>(zone.allocation_size())); | 3043 static_cast<int>(zone.allocation_size())); |
3040 return code; | 3044 return code; |
3041 } | 3045 } |
3042 | 3046 |
3043 | 3047 |
3044 } // namespace compiler | 3048 } // namespace compiler |
3045 } // namespace internal | 3049 } // namespace internal |
3046 } // namespace v8 | 3050 } // namespace v8 |
OLD | NEW |