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

Side by Side Diff: src/compiler/wasm-compiler.cc

Issue 2405293002: [wasm] Add stack checks to loops. (Closed)
Patch Set: comments addressed Created 4 years, 2 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 unified diff | Download patch
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | src/wasm/ast-decoder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 } 400 }
401 401
402 Node* WasmGraphBuilder::Int32Constant(int32_t value) { 402 Node* WasmGraphBuilder::Int32Constant(int32_t value) {
403 return jsgraph()->Int32Constant(value); 403 return jsgraph()->Int32Constant(value);
404 } 404 }
405 405
406 Node* WasmGraphBuilder::Int64Constant(int64_t value) { 406 Node* WasmGraphBuilder::Int64Constant(int64_t value) {
407 return jsgraph()->Int64Constant(value); 407 return jsgraph()->Int64Constant(value);
408 } 408 }
409 409
410 void WasmGraphBuilder::StackCheck(wasm::WasmCodePosition position) { 410 void WasmGraphBuilder::StackCheck(wasm::WasmCodePosition position,
411 Node** effect, Node** control) {
412 if (effect == nullptr) {
413 effect = effect_;
414 }
415 if (control == nullptr) {
416 control = control_;
417 }
411 // We do not generate stack checks for cctests. 418 // We do not generate stack checks for cctests.
412 if (module_ && !module_->instance->context.is_null()) { 419 if (module_ && !module_->instance->context.is_null()) {
413 Node* limit = graph()->NewNode( 420 Node* limit = graph()->NewNode(
414 jsgraph()->machine()->Load(MachineType::Pointer()), 421 jsgraph()->machine()->Load(MachineType::Pointer()),
415 jsgraph()->ExternalConstant( 422 jsgraph()->ExternalConstant(
416 ExternalReference::address_of_stack_limit(jsgraph()->isolate())), 423 ExternalReference::address_of_stack_limit(jsgraph()->isolate())),
417 jsgraph()->IntPtrConstant(0), *effect_, *control_); 424 jsgraph()->IntPtrConstant(0), *effect, *control);
418 Node* pointer = graph()->NewNode(jsgraph()->machine()->LoadStackPointer()); 425 Node* pointer = graph()->NewNode(jsgraph()->machine()->LoadStackPointer());
419 426
420 Node* check = 427 Node* check =
421 graph()->NewNode(jsgraph()->machine()->UintLessThan(), limit, pointer); 428 graph()->NewNode(jsgraph()->machine()->UintLessThan(), limit, pointer);
422 429
423 Diamond stack_check(graph(), jsgraph()->common(), check, BranchHint::kTrue); 430 Diamond stack_check(graph(), jsgraph()->common(), check, BranchHint::kTrue);
424 431 stack_check.Chain(*control);
425 Node* effect_true = *effect_; 432 Node* effect_true = *effect;
426 433
427 Node* effect_false; 434 Node* effect_false;
428 // Generate a call to the runtime if there is a stack check failure. 435 // Generate a call to the runtime if there is a stack check failure.
429 { 436 {
430 Node* node = BuildCallToRuntime(Runtime::kStackGuard, jsgraph(), 437 Node* node = BuildCallToRuntime(Runtime::kStackGuard, jsgraph(),
431 module_->instance->context, nullptr, 0, 438 module_->instance->context, nullptr, 0,
432 effect_, stack_check.if_false); 439 effect, stack_check.if_false);
433 effect_false = node; 440 effect_false = node;
434 } 441 }
435 442
436 Node* ephi = graph()->NewNode(jsgraph()->common()->EffectPhi(2), 443 Node* ephi = graph()->NewNode(jsgraph()->common()->EffectPhi(2),
437 effect_true, effect_false, stack_check.merge); 444 effect_true, effect_false, stack_check.merge);
438 445
439 *control_ = stack_check.merge; 446 *control = stack_check.merge;
440 *effect_ = ephi; 447 *effect = ephi;
441 } 448 }
442 } 449 }
443 450
444 Node* WasmGraphBuilder::Binop(wasm::WasmOpcode opcode, Node* left, Node* right, 451 Node* WasmGraphBuilder::Binop(wasm::WasmOpcode opcode, Node* left, Node* right,
445 wasm::WasmCodePosition position) { 452 wasm::WasmCodePosition position) {
446 const Operator* op; 453 const Operator* op;
447 MachineOperatorBuilder* m = jsgraph()->machine(); 454 MachineOperatorBuilder* m = jsgraph()->machine();
448 switch (opcode) { 455 switch (opcode) {
449 case wasm::kExprI32Add: 456 case wasm::kExprI32Add:
450 op = m->Int32Add(); 457 op = m->Int32Add();
(...skipping 2958 matching lines...) Expand 10 before | Expand all | Expand 10 after
3409 function_->code_start_offset), 3416 function_->code_start_offset),
3410 compile_ms); 3417 compile_ms);
3411 } 3418 }
3412 3419
3413 return code; 3420 return code;
3414 } 3421 }
3415 3422
3416 } // namespace compiler 3423 } // namespace compiler
3417 } // namespace internal 3424 } // namespace internal
3418 } // namespace v8 3425 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | src/wasm/ast-decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698