| 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 | 
|---|