OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 4536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4547 class DeferredStackCheck: public LDeferredCode { | 4547 class DeferredStackCheck: public LDeferredCode { |
4548 public: | 4548 public: |
4549 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) | 4549 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) |
4550 : LDeferredCode(codegen), instr_(instr) { } | 4550 : LDeferredCode(codegen), instr_(instr) { } |
4551 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); } | 4551 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); } |
4552 virtual LInstruction* instr() { return instr_; } | 4552 virtual LInstruction* instr() { return instr_; } |
4553 private: | 4553 private: |
4554 LStackCheck* instr_; | 4554 LStackCheck* instr_; |
4555 }; | 4555 }; |
4556 | 4556 |
4557 DeferredStackCheck* deferred_stack_check = | 4557 ASSERT(instr->HasEnvironment()); |
4558 new DeferredStackCheck(this, instr); | 4558 LEnvironment* env = instr->environment(); |
4559 ExternalReference stack_limit = | |
4560 ExternalReference::address_of_stack_limit(isolate()); | |
4561 __ cmp(esp, Operand::StaticVariable(stack_limit)); | |
4562 __ j(below, deferred_stack_check->entry()); | |
4563 EnsureSpaceForLazyDeopt(); | |
4564 __ bind(instr->done_label()); | |
4565 deferred_stack_check->SetExit(instr->done_label()); | |
4566 // There is no LLazyBailout instruction for stack-checks. We have to | 4559 // There is no LLazyBailout instruction for stack-checks. We have to |
4567 // prepare for lazy deoptimization explicitly here. | 4560 // prepare for lazy deoptimization explicitly here. |
4568 ASSERT(instr->HasEnvironment()); | 4561 if (instr->hydrogen()->is_function_entry()) { |
4569 LEnvironment* env = instr->environment(); | 4562 // Perform stack overflow check. |
4570 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); | 4563 Label done; |
4571 // Don't record a deoptimization index for the safepoint here. | 4564 ExternalReference stack_limit = |
4572 // This will be done explicitly when emitting call and the safepoint in | 4565 ExternalReference::address_of_stack_limit(isolate()); |
4573 // the deferred code. | 4566 __ cmp(esp, Operand::StaticVariable(stack_limit)); |
| 4567 __ j(above_equal, &done, Label::kNear); |
| 4568 |
| 4569 ASSERT(instr->context()->IsRegister()); |
| 4570 ASSERT(ToRegister(instr->context()).is(esi)); |
| 4571 StackCheckStub stub; |
| 4572 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| 4573 EnsureSpaceForLazyDeopt(); |
| 4574 __ bind(&done); |
| 4575 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
| 4576 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
| 4577 } else { |
| 4578 ASSERT(instr->hydrogen()->is_backwards_branch()); |
| 4579 // Perform stack overflow check if this goto needs it before jumping. |
| 4580 DeferredStackCheck* deferred_stack_check = |
| 4581 new DeferredStackCheck(this, instr); |
| 4582 ExternalReference stack_limit = |
| 4583 ExternalReference::address_of_stack_limit(isolate()); |
| 4584 __ cmp(esp, Operand::StaticVariable(stack_limit)); |
| 4585 __ j(below, deferred_stack_check->entry()); |
| 4586 EnsureSpaceForLazyDeopt(); |
| 4587 __ bind(instr->done_label()); |
| 4588 deferred_stack_check->SetExit(instr->done_label()); |
| 4589 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |
| 4590 // Don't record a deoptimization index for the safepoint here. |
| 4591 // This will be done explicitly when emitting call and the safepoint in |
| 4592 // the deferred code. |
| 4593 } |
4574 } | 4594 } |
4575 | 4595 |
4576 | 4596 |
4577 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { | 4597 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { |
4578 // This is a pseudo-instruction that ensures that the environment here is | 4598 // This is a pseudo-instruction that ensures that the environment here is |
4579 // properly registered for deoptimization and records the assembler's PC | 4599 // properly registered for deoptimization and records the assembler's PC |
4580 // offset. | 4600 // offset. |
4581 LEnvironment* environment = instr->environment(); | 4601 LEnvironment* environment = instr->environment(); |
4582 environment->SetSpilledRegisters(instr->SpilledRegisterArray(), | 4602 environment->SetSpilledRegisters(instr->SpilledRegisterArray(), |
4583 instr->SpilledDoubleRegisterArray()); | 4603 instr->SpilledDoubleRegisterArray()); |
(...skipping 27 matching lines...) Expand all Loading... |
4611 this, pointers, Safepoint::kLazyDeopt); | 4631 this, pointers, Safepoint::kLazyDeopt); |
4612 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator); | 4632 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator); |
4613 } | 4633 } |
4614 | 4634 |
4615 | 4635 |
4616 #undef __ | 4636 #undef __ |
4617 | 4637 |
4618 } } // namespace v8::internal | 4638 } } // namespace v8::internal |
4619 | 4639 |
4620 #endif // V8_TARGET_ARCH_IA32 | 4640 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |