| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 1 // Copyright 2012 the V8 project authors. All rights reserved.7 |
| 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 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 environment->Register(deoptimization_index, | 814 environment->Register(deoptimization_index, |
| 815 translation.index(), | 815 translation.index(), |
| 816 (mode == Safepoint::kLazyDeopt) ? pc_offset : -1); | 816 (mode == Safepoint::kLazyDeopt) ? pc_offset : -1); |
| 817 deoptimizations_.Add(environment, zone()); | 817 deoptimizations_.Add(environment, zone()); |
| 818 } | 818 } |
| 819 } | 819 } |
| 820 | 820 |
| 821 | 821 |
| 822 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, | 822 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, |
| 823 Deoptimizer::BailoutType bailout_type, | 823 Deoptimizer::BailoutType bailout_type, |
| 824 Register src1, const Operand& src2) { | 824 Register src1, const Operand& src2, |
| 825 const char* reason) { |
| 825 LEnvironment* environment = instr->environment(); | 826 LEnvironment* environment = instr->environment(); |
| 826 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); | 827 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
| 827 DCHECK(environment->HasBeenRegistered()); | 828 DCHECK(environment->HasBeenRegistered()); |
| 828 int id = environment->deoptimization_index(); | 829 int id = environment->deoptimization_index(); |
| 829 DCHECK(info()->IsOptimizing() || info()->IsStub()); | 830 DCHECK(info()->IsOptimizing() || info()->IsStub()); |
| 830 Address entry = | 831 Address entry = |
| 831 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); | 832 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); |
| 832 if (entry == NULL) { | 833 if (entry == NULL) { |
| 833 Abort(kBailoutWasNotPrepared); | 834 Abort(kBailoutWasNotPrepared); |
| 834 return; | 835 return; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 860 } | 861 } |
| 861 __ stop("trap_on_deopt"); | 862 __ stop("trap_on_deopt"); |
| 862 __ bind(&skip); | 863 __ bind(&skip); |
| 863 } | 864 } |
| 864 | 865 |
| 865 DCHECK(info()->IsStub() || frame_is_built_); | 866 DCHECK(info()->IsStub() || frame_is_built_); |
| 866 // Go through jump table if we need to handle condition, build frame, or | 867 // Go through jump table if we need to handle condition, build frame, or |
| 867 // restore caller doubles. | 868 // restore caller doubles. |
| 868 if (condition == al && frame_is_built_ && | 869 if (condition == al && frame_is_built_ && |
| 869 !info()->saves_caller_doubles()) { | 870 !info()->saves_caller_doubles()) { |
| 871 DeoptComment(instr->Mnemonic(), reason); |
| 870 __ Call(entry, RelocInfo::RUNTIME_ENTRY, condition, src1, src2); | 872 __ Call(entry, RelocInfo::RUNTIME_ENTRY, condition, src1, src2); |
| 871 } else { | 873 } else { |
| 872 // We often have several deopts to the same entry, reuse the last | 874 // We often have several deopts to the same entry, reuse the last |
| 873 // jump entry if this is the case. | 875 // jump entry if this is the case. |
| 874 if (deopt_jump_table_.is_empty() || | 876 if (deopt_jump_table_.is_empty() || |
| 875 (deopt_jump_table_.last().address != entry) || | 877 (deopt_jump_table_.last().address != entry) || |
| 876 (deopt_jump_table_.last().bailout_type != bailout_type) || | 878 (deopt_jump_table_.last().bailout_type != bailout_type) || |
| 877 (deopt_jump_table_.last().needs_frame != !frame_is_built_)) { | 879 (deopt_jump_table_.last().needs_frame != !frame_is_built_)) { |
| 878 Deoptimizer::JumpTableEntry table_entry(entry, | 880 Deoptimizer::JumpTableEntry table_entry(entry, instr->Mnemonic(), reason, |
| 879 bailout_type, | 881 bailout_type, !frame_is_built_); |
| 880 !frame_is_built_); | |
| 881 deopt_jump_table_.Add(table_entry, zone()); | 882 deopt_jump_table_.Add(table_entry, zone()); |
| 882 } | 883 } |
| 883 __ Branch(&deopt_jump_table_.last().label, condition, src1, src2); | 884 __ Branch(&deopt_jump_table_.last().label, condition, src1, src2); |
| 884 } | 885 } |
| 885 } | 886 } |
| 886 | 887 |
| 887 | 888 |
| 888 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, | 889 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, |
| 889 Register src1, const Operand& src2) { | 890 Register src1, const Operand& src2, |
| 891 const char* reason) { |
| 890 Deoptimizer::BailoutType bailout_type = info()->IsStub() | 892 Deoptimizer::BailoutType bailout_type = info()->IsStub() |
| 891 ? Deoptimizer::LAZY | 893 ? Deoptimizer::LAZY |
| 892 : Deoptimizer::EAGER; | 894 : Deoptimizer::EAGER; |
| 893 DeoptimizeIf(condition, instr, bailout_type, src1, src2); | 895 DeoptimizeIf(condition, instr, bailout_type, src1, src2, reason); |
| 894 } | 896 } |
| 895 | 897 |
| 896 | 898 |
| 897 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { | 899 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { |
| 898 int length = deoptimizations_.length(); | 900 int length = deoptimizations_.length(); |
| 899 if (length == 0) return; | 901 if (length == 0) return; |
| 900 Handle<DeoptimizationInputData> data = | 902 Handle<DeoptimizationInputData> data = |
| 901 DeoptimizationInputData::New(isolate(), length, TENURED); | 903 DeoptimizationInputData::New(isolate(), length, TENURED); |
| 902 | 904 |
| 903 Handle<ByteArray> translations = | 905 Handle<ByteArray> translations = |
| (...skipping 4765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5669 void LCodeGen::DoDeoptimize(LDeoptimize* instr) { | 5671 void LCodeGen::DoDeoptimize(LDeoptimize* instr) { |
| 5670 Deoptimizer::BailoutType type = instr->hydrogen()->type(); | 5672 Deoptimizer::BailoutType type = instr->hydrogen()->type(); |
| 5671 // TODO(danno): Stubs expect all deopts to be lazy for historical reasons (the | 5673 // TODO(danno): Stubs expect all deopts to be lazy for historical reasons (the |
| 5672 // needed return address), even though the implementation of LAZY and EAGER is | 5674 // needed return address), even though the implementation of LAZY and EAGER is |
| 5673 // now identical. When LAZY is eventually completely folded into EAGER, remove | 5675 // now identical. When LAZY is eventually completely folded into EAGER, remove |
| 5674 // the special case below. | 5676 // the special case below. |
| 5675 if (info()->IsStub() && type == Deoptimizer::EAGER) { | 5677 if (info()->IsStub() && type == Deoptimizer::EAGER) { |
| 5676 type = Deoptimizer::LAZY; | 5678 type = Deoptimizer::LAZY; |
| 5677 } | 5679 } |
| 5678 | 5680 |
| 5679 Comment(";;; deoptimize: %s", instr->hydrogen()->reason()); | 5681 DeoptimizeIf(al, instr, type, zero_reg, Operand(zero_reg), |
| 5680 DeoptimizeIf(al, instr, type, zero_reg, Operand(zero_reg)); | 5682 instr->hydrogen()->reason()); |
| 5681 } | 5683 } |
| 5682 | 5684 |
| 5683 | 5685 |
| 5684 void LCodeGen::DoDummy(LDummy* instr) { | 5686 void LCodeGen::DoDummy(LDummy* instr) { |
| 5685 // Nothing to see here, move on! | 5687 // Nothing to see here, move on! |
| 5686 } | 5688 } |
| 5687 | 5689 |
| 5688 | 5690 |
| 5689 void LCodeGen::DoDummyUse(LDummyUse* instr) { | 5691 void LCodeGen::DoDummyUse(LDummyUse* instr) { |
| 5690 // Nothing to see here, move on! | 5692 // Nothing to see here, move on! |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5915 __ li(at, scope_info); | 5917 __ li(at, scope_info); |
| 5916 __ Push(at, ToRegister(instr->function())); | 5918 __ Push(at, ToRegister(instr->function())); |
| 5917 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5919 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 5918 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5920 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 5919 } | 5921 } |
| 5920 | 5922 |
| 5921 | 5923 |
| 5922 #undef __ | 5924 #undef __ |
| 5923 | 5925 |
| 5924 } } // namespace v8::internal | 5926 } } // namespace v8::internal |
| OLD | NEW |