| Index: src/x64/deoptimizer-x64.cc
|
| ===================================================================
|
| --- src/x64/deoptimizer-x64.cc (revision 9984)
|
| +++ src/x64/deoptimizer-x64.cc (working copy)
|
| @@ -42,70 +42,10 @@
|
|
|
|
|
| int Deoptimizer::patch_size() {
|
| - return MacroAssembler::kCallInstructionLength;
|
| + return Assembler::kCallInstructionLength;
|
| }
|
|
|
|
|
| -#ifdef DEBUG
|
| -// Overwrites code with int3 instructions.
|
| -static void ZapCodeRange(Address from, Address to) {
|
| - CHECK(from <= to);
|
| - int length = static_cast<int>(to - from);
|
| - CodePatcher destroyer(from, length);
|
| - while (length-- > 0) {
|
| - destroyer.masm()->int3();
|
| - }
|
| -}
|
| -#endif
|
| -
|
| -
|
| -// Iterate through the entries of a SafepointTable that corresponds to
|
| -// deoptimization points.
|
| -class SafepointTableDeoptimiztionEntryIterator {
|
| - public:
|
| - explicit SafepointTableDeoptimiztionEntryIterator(Code* code)
|
| - : code_(code), table_(code), index_(-1), limit_(table_.length()) {
|
| - FindNextIndex();
|
| - }
|
| -
|
| - SafepointEntry Next(Address* pc) {
|
| - if (index_ >= limit_) {
|
| - *pc = NULL;
|
| - return SafepointEntry(); // Invalid entry.
|
| - }
|
| - *pc = code_->instruction_start() + table_.GetPcOffset(index_);
|
| - SafepointEntry entry = table_.GetEntry(index_);
|
| - FindNextIndex();
|
| - return entry;
|
| - }
|
| -
|
| - private:
|
| - void FindNextIndex() {
|
| - ASSERT(index_ < limit_);
|
| - while (++index_ < limit_) {
|
| - if (table_.GetEntry(index_).deoptimization_index() !=
|
| - Safepoint::kNoDeoptimizationIndex) {
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - Code* code_;
|
| - SafepointTable table_;
|
| - // Index of next deoptimization entry. If negative after calling
|
| - // FindNextIndex, there are no more, and Next will return an invalid
|
| - // SafepointEntry.
|
| - int index_;
|
| - // Table length.
|
| - int limit_;
|
| -};
|
| -
|
| -
|
| -void Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(Handle<Code> code) {
|
| - // TODO(1276): Implement.
|
| -}
|
| -
|
| -
|
| void Deoptimizer::DeoptimizeFunction(JSFunction* function) {
|
| HandleScope scope;
|
| AssertNoAllocation no_allocation;
|
| @@ -119,84 +59,34 @@
|
| // code patching below, and is not needed any more.
|
| code->InvalidateRelocation();
|
|
|
| - // For each return after a safepoint insert a absolute call to the
|
| + // For each LLazyBailout instruction insert a absolute call to the
|
| // corresponding deoptimization entry, or a short call to an absolute
|
| // jump if space is short. The absolute jumps are put in a table just
|
| // before the safepoint table (space was allocated there when the Code
|
| // object was created, if necessary).
|
|
|
| Address instruction_start = function->code()->instruction_start();
|
| - Address jump_table_address =
|
| - instruction_start + function->code()->safepoint_table_offset();
|
| #ifdef DEBUG
|
| - Address previous_pc = instruction_start;
|
| + Address prev_call_address = NULL;
|
| #endif
|
| -
|
| - SafepointTableDeoptimiztionEntryIterator deoptimizations(function->code());
|
| - Address entry_pc = NULL;
|
| -
|
| - SafepointEntry current_entry = deoptimizations.Next(&entry_pc);
|
| - while (current_entry.is_valid()) {
|
| - int gap_code_size = current_entry.gap_code_size();
|
| - unsigned deoptimization_index = current_entry.deoptimization_index();
|
| -
|
| -#ifdef DEBUG
|
| - // Destroy the code which is not supposed to run again.
|
| - ZapCodeRange(previous_pc, entry_pc);
|
| -#endif
|
| + DeoptimizationInputData* deopt_data =
|
| + DeoptimizationInputData::cast(code->deoptimization_data());
|
| + for (int i = 0; i < deopt_data->DeoptCount(); i++) {
|
| + if (deopt_data->Pc(i)->value() == -1) continue;
|
| // Position where Call will be patched in.
|
| - Address call_address = entry_pc + gap_code_size;
|
| - // End of call instruction, if using a direct call to a 64-bit address.
|
| - Address call_end_address =
|
| - call_address + MacroAssembler::kCallInstructionLength;
|
| -
|
| - // Find next deoptimization entry, if any.
|
| - Address next_pc = NULL;
|
| - SafepointEntry next_entry = deoptimizations.Next(&next_pc);
|
| -
|
| - if (!next_entry.is_valid() || next_pc >= call_end_address) {
|
| - // Room enough to write a long call instruction.
|
| - CodePatcher patcher(call_address, Assembler::kCallInstructionLength);
|
| - patcher.masm()->Call(GetDeoptimizationEntry(deoptimization_index, LAZY),
|
| - RelocInfo::NONE);
|
| + Address call_address = instruction_start + deopt_data->Pc(i)->value();
|
| + // There is room enough to write a long call instruction because we pad
|
| + // LLazyBailout instructions with nops if necessary.
|
| + CodePatcher patcher(call_address, Assembler::kCallInstructionLength);
|
| + patcher.masm()->Call(GetDeoptimizationEntry(i, LAZY), RelocInfo::NONE);
|
| + ASSERT(prev_call_address == NULL ||
|
| + call_address >= prev_call_address + patch_size());
|
| + ASSERT(call_address + patch_size() <= code->instruction_end());
|
| #ifdef DEBUG
|
| - previous_pc = call_end_address;
|
| + prev_call_address = call_address;
|
| #endif
|
| - } else {
|
| - // Not room enough for a long Call instruction. Write a short call
|
| - // instruction to a long jump placed elsewhere in the code.
|
| -#ifdef DEBUG
|
| - Address short_call_end_address =
|
| - call_address + MacroAssembler::kShortCallInstructionLength;
|
| -#endif
|
| - ASSERT(next_pc >= short_call_end_address);
|
| -
|
| - // Write jump in jump-table.
|
| - jump_table_address -= MacroAssembler::kJumpInstructionLength;
|
| - CodePatcher jump_patcher(jump_table_address,
|
| - MacroAssembler::kJumpInstructionLength);
|
| - jump_patcher.masm()->Jump(
|
| - GetDeoptimizationEntry(deoptimization_index, LAZY),
|
| - RelocInfo::NONE);
|
| -
|
| - // Write call to jump at call_offset.
|
| - CodePatcher call_patcher(call_address,
|
| - MacroAssembler::kShortCallInstructionLength);
|
| - call_patcher.masm()->call(jump_table_address);
|
| -#ifdef DEBUG
|
| - previous_pc = short_call_end_address;
|
| -#endif
|
| - }
|
| -
|
| - // Continue with next deoptimization entry.
|
| - current_entry = next_entry;
|
| - entry_pc = next_pc;
|
| }
|
|
|
| -#ifdef DEBUG
|
| - // Destroy the code which is not supposed to run again.
|
| - ZapCodeRange(previous_pc, jump_table_address);
|
| -#endif
|
| Isolate* isolate = code->GetIsolate();
|
|
|
| // Add the deoptimizing code to the list.
|
| @@ -217,11 +107,6 @@
|
| PrintF("[forced deoptimization: ");
|
| function->PrintName();
|
| PrintF(" / %" V8PRIxPTR "]\n", reinterpret_cast<intptr_t>(function));
|
| -#ifdef DEBUG
|
| - if (FLAG_print_code) {
|
| - code->PrintLn();
|
| - }
|
| -#endif
|
| }
|
| }
|
|
|
|
|