OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/arm/lithium-codegen-arm.h" | 7 #include "src/arm/lithium-codegen-arm.h" |
8 #include "src/arm/lithium-gap-resolver-arm.h" | 8 #include "src/arm/lithium-gap-resolver-arm.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 for (int i = 0; i < length; i++) { | 335 for (int i = 0; i < length; i++) { |
336 Deoptimizer::JumpTableEntry* table_entry = &deopt_jump_table_[i]; | 336 Deoptimizer::JumpTableEntry* table_entry = &deopt_jump_table_[i]; |
337 __ bind(&table_entry->label); | 337 __ bind(&table_entry->label); |
338 | 338 |
339 Deoptimizer::BailoutType type = table_entry->bailout_type; | 339 Deoptimizer::BailoutType type = table_entry->bailout_type; |
340 DCHECK(type == deopt_jump_table_[0].bailout_type); | 340 DCHECK(type == deopt_jump_table_[0].bailout_type); |
341 Address entry = table_entry->address; | 341 Address entry = table_entry->address; |
342 int id = Deoptimizer::GetDeoptimizationId(isolate(), entry, type); | 342 int id = Deoptimizer::GetDeoptimizationId(isolate(), entry, type); |
343 DCHECK_NE(Deoptimizer::kNotDeoptimizationEntry, id); | 343 DCHECK_NE(Deoptimizer::kNotDeoptimizationEntry, id); |
344 Comment(";;; jump table entry %d: deoptimization bailout %d.", i, id); | 344 Comment(";;; jump table entry %d: deoptimization bailout %d.", i, id); |
345 DeoptComment(table_entry->mnemonic, table_entry->reason); | 345 DeoptComment(table_entry->reason); |
346 | 346 |
347 // Second-level deopt table entries are contiguous and small, so instead | 347 // Second-level deopt table entries are contiguous and small, so instead |
348 // of loading the full, absolute address of each one, load an immediate | 348 // of loading the full, absolute address of each one, load an immediate |
349 // offset which will be added to the base address later. | 349 // offset which will be added to the base address later. |
350 __ mov(entry_offset, Operand(entry - base)); | 350 __ mov(entry_offset, Operand(entry - base)); |
351 | 351 |
352 if (table_entry->needs_frame) { | 352 if (table_entry->needs_frame) { |
353 DCHECK(!info()->saves_caller_doubles()); | 353 DCHECK(!info()->saves_caller_doubles()); |
354 if (needs_frame.is_bound()) { | 354 if (needs_frame.is_bound()) { |
355 __ b(&needs_frame); | 355 __ b(&needs_frame); |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
839 int pc_offset = masm()->pc_offset(); | 839 int pc_offset = masm()->pc_offset(); |
840 environment->Register(deoptimization_index, | 840 environment->Register(deoptimization_index, |
841 translation.index(), | 841 translation.index(), |
842 (mode == Safepoint::kLazyDeopt) ? pc_offset : -1); | 842 (mode == Safepoint::kLazyDeopt) ? pc_offset : -1); |
843 deoptimizations_.Add(environment, zone()); | 843 deoptimizations_.Add(environment, zone()); |
844 } | 844 } |
845 } | 845 } |
846 | 846 |
847 | 847 |
848 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, | 848 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, |
849 const char* reason, | 849 const char* detail, |
850 Deoptimizer::BailoutType bailout_type) { | 850 Deoptimizer::BailoutType bailout_type) { |
851 LEnvironment* environment = instr->environment(); | 851 LEnvironment* environment = instr->environment(); |
852 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); | 852 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
853 DCHECK(environment->HasBeenRegistered()); | 853 DCHECK(environment->HasBeenRegistered()); |
854 int id = environment->deoptimization_index(); | 854 int id = environment->deoptimization_index(); |
855 DCHECK(info()->IsOptimizing() || info()->IsStub()); | 855 DCHECK(info()->IsOptimizing() || info()->IsStub()); |
856 Address entry = | 856 Address entry = |
857 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); | 857 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); |
858 if (entry == NULL) { | 858 if (entry == NULL) { |
859 Abort(kBailoutWasNotPrepared); | 859 Abort(kBailoutWasNotPrepared); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 if (condition != al) { | 892 if (condition != al) { |
893 condition = ne; | 893 condition = ne; |
894 __ cmp(scratch, Operand::Zero()); | 894 __ cmp(scratch, Operand::Zero()); |
895 } | 895 } |
896 } | 896 } |
897 | 897 |
898 if (info()->ShouldTrapOnDeopt()) { | 898 if (info()->ShouldTrapOnDeopt()) { |
899 __ stop("trap_on_deopt", condition); | 899 __ stop("trap_on_deopt", condition); |
900 } | 900 } |
901 | 901 |
| 902 Deoptimizer::Reason reason(instr->Mnemonic(), detail); |
902 DCHECK(info()->IsStub() || frame_is_built_); | 903 DCHECK(info()->IsStub() || frame_is_built_); |
903 // Go through jump table if we need to handle condition, build frame, or | 904 // Go through jump table if we need to handle condition, build frame, or |
904 // restore caller doubles. | 905 // restore caller doubles. |
905 if (condition == al && frame_is_built_ && | 906 if (condition == al && frame_is_built_ && |
906 !info()->saves_caller_doubles()) { | 907 !info()->saves_caller_doubles()) { |
907 DeoptComment(instr->Mnemonic(), reason); | 908 DeoptComment(reason); |
908 __ Call(entry, RelocInfo::RUNTIME_ENTRY); | 909 __ Call(entry, RelocInfo::RUNTIME_ENTRY); |
909 } else { | 910 } else { |
910 // We often have several deopts to the same entry, reuse the last | 911 // We often have several deopts to the same entry, reuse the last |
911 // jump entry if this is the case. | 912 // jump entry if this is the case. |
912 if (deopt_jump_table_.is_empty() || | 913 if (deopt_jump_table_.is_empty() || |
913 (deopt_jump_table_.last().address != entry) || | 914 (deopt_jump_table_.last().address != entry) || |
914 (deopt_jump_table_.last().bailout_type != bailout_type) || | 915 (deopt_jump_table_.last().bailout_type != bailout_type) || |
915 (deopt_jump_table_.last().needs_frame != !frame_is_built_)) { | 916 (deopt_jump_table_.last().needs_frame != !frame_is_built_)) { |
916 Deoptimizer::JumpTableEntry table_entry(entry, instr->Mnemonic(), reason, | 917 Deoptimizer::JumpTableEntry table_entry(entry, reason, bailout_type, |
917 bailout_type, !frame_is_built_); | 918 !frame_is_built_); |
918 deopt_jump_table_.Add(table_entry, zone()); | 919 deopt_jump_table_.Add(table_entry, zone()); |
919 } | 920 } |
920 __ b(condition, &deopt_jump_table_.last().label); | 921 __ b(condition, &deopt_jump_table_.last().label); |
921 } | 922 } |
922 } | 923 } |
923 | 924 |
924 | 925 |
925 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, | 926 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, |
926 const char* reason) { | 927 const char* detail) { |
927 Deoptimizer::BailoutType bailout_type = info()->IsStub() | 928 Deoptimizer::BailoutType bailout_type = info()->IsStub() |
928 ? Deoptimizer::LAZY | 929 ? Deoptimizer::LAZY |
929 : Deoptimizer::EAGER; | 930 : Deoptimizer::EAGER; |
930 DeoptimizeIf(condition, instr, reason, bailout_type); | 931 DeoptimizeIf(condition, instr, detail, bailout_type); |
931 } | 932 } |
932 | 933 |
933 | 934 |
934 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { | 935 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { |
935 int length = deoptimizations_.length(); | 936 int length = deoptimizations_.length(); |
936 if (length == 0) return; | 937 if (length == 0) return; |
937 Handle<DeoptimizationInputData> data = | 938 Handle<DeoptimizationInputData> data = |
938 DeoptimizationInputData::New(isolate(), length, TENURED); | 939 DeoptimizationInputData::New(isolate(), length, TENURED); |
939 | 940 |
940 Handle<ByteArray> translations = | 941 Handle<ByteArray> translations = |
(...skipping 4969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5910 __ Push(scope_info); | 5911 __ Push(scope_info); |
5911 __ push(ToRegister(instr->function())); | 5912 __ push(ToRegister(instr->function())); |
5912 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5913 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5913 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5914 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5914 } | 5915 } |
5915 | 5916 |
5916 | 5917 |
5917 #undef __ | 5918 #undef __ |
5918 | 5919 |
5919 } } // namespace v8::internal | 5920 } } // namespace v8::internal |
OLD | NEW |