| Index: src/arm/deoptimizer-arm.cc
|
| ===================================================================
|
| --- src/arm/deoptimizer-arm.cc (revision 9915)
|
| +++ src/arm/deoptimizer-arm.cc (working copy)
|
| @@ -44,12 +44,6 @@
|
| }
|
|
|
|
|
| -void Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(Handle<Code> code) {
|
| - // Nothing to do. No new relocation information is written for lazy
|
| - // deoptimization on ARM.
|
| -}
|
| -
|
| -
|
| void Deoptimizer::DeoptimizeFunction(JSFunction* function) {
|
| HandleScope scope;
|
| AssertNoAllocation no_allocation;
|
| @@ -58,59 +52,29 @@
|
|
|
| // Get the optimized code.
|
| Code* code = function->code();
|
| + Address code_start_address = code->instruction_start();
|
|
|
| // Invalidate the relocation information, as it will become invalid by the
|
| // code patching below, and is not needed any more.
|
| code->InvalidateRelocation();
|
|
|
| - // For each return after a safepoint insert an absolute call to the
|
| - // corresponding deoptimization entry.
|
| - unsigned last_pc_offset = 0;
|
| - SafepointTable table(function->code());
|
| - for (unsigned i = 0; i < table.length(); i++) {
|
| - unsigned pc_offset = table.GetPcOffset(i);
|
| - SafepointEntry safepoint_entry = table.GetEntry(i);
|
| - int deoptimization_index = safepoint_entry.deoptimization_index();
|
| - int gap_code_size = safepoint_entry.gap_code_size();
|
| - // Check that we did not shoot past next safepoint.
|
| - CHECK(pc_offset >= last_pc_offset);
|
| -#ifdef DEBUG
|
| - // Destroy the code which is not supposed to be run again.
|
| - int instructions = (pc_offset - last_pc_offset) / Assembler::kInstrSize;
|
| - CodePatcher destroyer(code->instruction_start() + last_pc_offset,
|
| - instructions);
|
| - for (int x = 0; x < instructions; x++) {
|
| - destroyer.masm()->bkpt(0);
|
| - }
|
| -#endif
|
| - last_pc_offset = pc_offset;
|
| - if (deoptimization_index != Safepoint::kNoDeoptimizationIndex) {
|
| - Address deoptimization_entry = Deoptimizer::GetDeoptimizationEntry(
|
| - deoptimization_index, Deoptimizer::LAZY);
|
| - last_pc_offset += gap_code_size;
|
| - int call_size_in_bytes = MacroAssembler::CallSize(deoptimization_entry,
|
| - RelocInfo::NONE);
|
| - int call_size_in_words = call_size_in_bytes / Assembler::kInstrSize;
|
| - ASSERT(call_size_in_bytes % Assembler::kInstrSize == 0);
|
| - ASSERT(call_size_in_bytes <= patch_size());
|
| - CodePatcher patcher(code->instruction_start() + last_pc_offset,
|
| - call_size_in_words);
|
| - patcher.masm()->Call(deoptimization_entry, RelocInfo::NONE);
|
| - last_pc_offset += call_size_in_bytes;
|
| - }
|
| + // For each LLazyBailout instruction insert a call to the corresponding
|
| + // deoptimization entry.
|
| + 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;
|
| + Address call_address = code_start_address + deopt_data->Pc(i)->value();
|
| + Address deopt_entry = GetDeoptimizationEntry(i, LAZY);
|
| + int call_size_in_bytes = MacroAssembler::CallSize(deopt_entry,
|
| + RelocInfo::NONE);
|
| + int call_size_in_words = call_size_in_bytes / Assembler::kInstrSize;
|
| + ASSERT(call_size_in_bytes % Assembler::kInstrSize == 0);
|
| + ASSERT(call_size_in_bytes <= patch_size());
|
| + CodePatcher patcher(call_address, call_size_in_words);
|
| + patcher.masm()->Call(deopt_entry, RelocInfo::NONE);
|
| }
|
|
|
| -#ifdef DEBUG
|
| - // Destroy the code which is not supposed to be run again.
|
| - int instructions =
|
| - (code->safepoint_table_offset() - last_pc_offset) / Assembler::kInstrSize;
|
| - CodePatcher destroyer(code->instruction_start() + last_pc_offset,
|
| - instructions);
|
| - for (int x = 0; x < instructions; x++) {
|
| - destroyer.masm()->bkpt(0);
|
| - }
|
| -#endif
|
| -
|
| Isolate* isolate = code->GetIsolate();
|
|
|
| // Add the deoptimizing code to the list.
|
| @@ -131,11 +95,6 @@
|
| PrintF("[forced deoptimization: ");
|
| function->PrintName();
|
| PrintF(" / %x]\n", reinterpret_cast<uint32_t>(function));
|
| -#ifdef DEBUG
|
| - if (FLAG_print_code) {
|
| - code->PrintLn();
|
| - }
|
| -#endif
|
| }
|
| }
|
|
|
|
|