diff options
Diffstat (limited to 'deps/v8/src/ia32/deoptimizer-ia32.cc')
-rw-r--r-- | deps/v8/src/ia32/deoptimizer-ia32.cc | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/deps/v8/src/ia32/deoptimizer-ia32.cc b/deps/v8/src/ia32/deoptimizer-ia32.cc index a646052eee..322993ee61 100644 --- a/deps/v8/src/ia32/deoptimizer-ia32.cc +++ b/deps/v8/src/ia32/deoptimizer-ia32.cc @@ -80,6 +80,7 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) { Address prev_address = code_start_address; for (unsigned i = 0; i < table.length(); ++i) { Address curr_address = code_start_address + table.GetPcOffset(i); + ASSERT_GE(curr_address, prev_address); ZapCodeRange(prev_address, curr_address); SafepointEntry safepoint_entry = table.GetEntry(i); @@ -97,7 +98,8 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) { RelocInfo::RUNTIME_ENTRY, reinterpret_cast<intptr_t>(deopt_entry)); reloc_info_writer.Write(&rinfo); - + ASSERT_GE(reloc_info_writer.pos(), + reloc_info->address() + ByteArray::kHeaderSize); curr_address += patch_size(); } prev_address = curr_address; @@ -137,39 +139,39 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) { void Deoptimizer::PatchStackCheckCodeAt(Address pc_after, Code* check_code, Code* replacement_code) { - Address call_target_address = pc_after - kPointerSize; - ASSERT(check_code->entry() == - Assembler::target_address_at(call_target_address)); - // The stack check code matches the pattern: - // - // cmp esp, <limit> - // jae ok - // call <stack guard> - // test eax, <loop nesting depth> - // ok: ... - // - // We will patch away the branch so the code is: - // - // cmp esp, <limit> ;; Not changed - // nop - // nop - // call <on-stack replacment> - // test eax, <loop nesting depth> - // ok: - ASSERT(*(call_target_address - 3) == 0x73 && // jae - *(call_target_address - 2) == 0x07 && // offset - *(call_target_address - 1) == 0xe8); // call - *(call_target_address - 3) = 0x90; // nop - *(call_target_address - 2) = 0x90; // nop - Assembler::set_target_address_at(call_target_address, - replacement_code->entry()); + Address call_target_address = pc_after - kIntSize; + ASSERT(check_code->entry() == + Assembler::target_address_at(call_target_address)); + // The stack check code matches the pattern: + // + // cmp esp, <limit> + // jae ok + // call <stack guard> + // test eax, <loop nesting depth> + // ok: ... + // + // We will patch away the branch so the code is: + // + // cmp esp, <limit> ;; Not changed + // nop + // nop + // call <on-stack replacment> + // test eax, <loop nesting depth> + // ok: + ASSERT(*(call_target_address - 3) == 0x73 && // jae + *(call_target_address - 2) == 0x07 && // offset + *(call_target_address - 1) == 0xe8); // call + *(call_target_address - 3) = 0x90; // nop + *(call_target_address - 2) = 0x90; // nop + Assembler::set_target_address_at(call_target_address, + replacement_code->entry()); } void Deoptimizer::RevertStackCheckCodeAt(Address pc_after, Code* check_code, Code* replacement_code) { - Address call_target_address = pc_after - kPointerSize; + Address call_target_address = pc_after - kIntSize; ASSERT(replacement_code->entry() == Assembler::target_address_at(call_target_address)); // Replace the nops from patching (Deoptimizer::PatchStackCheckCode) to |