From 8152635387fc6b0f66781963d8413f220c6008a1 Mon Sep 17 00:00:00 2001 From: "karlklose@chromium.org" Date: Wed, 2 Feb 2011 11:58:24 +0000 Subject: [PATCH] Extract platform independent part of RevertStackCheckCode. BUG=none TEST=none Review URL: http://codereview.chromium.org/6349046 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6572 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/deoptimizer-arm.cc | 12 ++++++------ src/deoptimizer.cc | 21 ++++++++++++++++++++- src/deoptimizer.h | 12 +++++++++--- src/ia32/deoptimizer-ia32.cc | 41 ++++++++++++++++++----------------------- src/x64/deoptimizer-x64.cc | 12 ++++++------ 5 files changed, 59 insertions(+), 39 deletions(-) diff --git a/src/arm/deoptimizer-arm.cc b/src/arm/deoptimizer-arm.cc index fb075e9..4fa09c3 100644 --- a/src/arm/deoptimizer-arm.cc +++ b/src/arm/deoptimizer-arm.cc @@ -112,16 +112,16 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) { } -void Deoptimizer::PatchStackCheckAt(Address pc_after, - Code* check_code, - Code* replacement_code) { +void Deoptimizer::PatchStackCheckCodeAt(Address pc_after, + Code* check_code, + Code* replacement_code) { UNIMPLEMENTED(); } -void Deoptimizer::RevertStackCheckCode(Code* unoptimized_code, - Code* check_code, - Code* replacement_code) { +void Deoptimizer::RevertStackCheckCodeAt(Address pc_after, + Code* check_code, + Code* replacement_code) { UNIMPLEMENTED(); } diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc index e6742fe..f081576 100644 --- a/src/deoptimizer.cc +++ b/src/deoptimizer.cc @@ -823,7 +823,26 @@ void Deoptimizer::PatchStackCheckCode(Code* unoptimized_code, for (uint32_t i = 0; i < table_length; ++i) { uint32_t pc_offset = Memory::uint32_at(stack_check_cursor + kIntSize); Address pc_after = unoptimized_code->instruction_start() + pc_offset; - PatchStackCheckAt(pc_after, check_code, replacement_code); + PatchStackCheckCodeAt(pc_after, check_code, replacement_code); + stack_check_cursor += 2 * kIntSize; + } +} + + +void Deoptimizer::RevertStackCheckCode(Code* unoptimized_code, + Code* check_code, + Code* replacement_code) { + // Iterate over the stack check table and revert the patched + // stack check calls. + ASSERT(unoptimized_code->kind() == Code::FUNCTION); + Address stack_check_cursor = unoptimized_code->instruction_start() + + unoptimized_code->stack_check_table_start(); + uint32_t table_length = Memory::uint32_at(stack_check_cursor); + stack_check_cursor += kIntSize; + for (uint32_t i = 0; i < table_length; ++i) { + uint32_t pc_offset = Memory::uint32_at(stack_check_cursor + kIntSize); + Address pc_after = unoptimized_code->instruction_start() + pc_offset; + RevertStackCheckCodeAt(pc_after, check_code, replacement_code); stack_check_cursor += 2 * kIntSize; } } diff --git a/src/deoptimizer.h b/src/deoptimizer.h index 6c3754c..de5e57f 100644 --- a/src/deoptimizer.h +++ b/src/deoptimizer.h @@ -136,9 +136,9 @@ class Deoptimizer : public Malloced { // Patch stack guard check at instruction before pc_after in // the unoptimized code to unconditionally call replacement_code. - static void PatchStackCheckAt(Address pc_after, - Code* check_code, - Code* replacement_code); + static void PatchStackCheckCodeAt(Address pc_after, + Code* check_code, + Code* replacement_code); // Change all patched stack guard checks in the unoptimized code // back to a normal stack guard check. @@ -146,6 +146,12 @@ class Deoptimizer : public Malloced { Code* check_code, Code* replacement_code); + // Change all patched stack guard checks in the unoptimized code + // back to a normal stack guard check. + static void RevertStackCheckCodeAt(Address pc_after, + Code* check_code, + Code* replacement_code); + ~Deoptimizer(); void InsertHeapNumberValues(int index, JavaScriptFrame* frame); diff --git a/src/ia32/deoptimizer-ia32.cc b/src/ia32/deoptimizer-ia32.cc index 6184e19..4e0bf47 100644 --- a/src/ia32/deoptimizer-ia32.cc +++ b/src/ia32/deoptimizer-ia32.cc @@ -147,9 +147,9 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) { } -void Deoptimizer::PatchStackCheckAt(Address pc_after, - Code* check_code, - Code* replacement_code) { +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)); @@ -179,26 +179,21 @@ void Deoptimizer::PatchStackCheckAt(Address pc_after, } -void Deoptimizer::RevertStackCheckCode(Code* unoptimized_code, - Code* check_code, - Code* replacement_code) { - // Iterate the unoptimized code and revert all the patched stack checks. - for (RelocIterator it(unoptimized_code, RelocInfo::kCodeTargetMask); - !it.done(); - it.next()) { - RelocInfo* rinfo = it.rinfo(); - if (rinfo->target_address() == replacement_code->entry()) { - // Replace the nops from patching (Deoptimizer::PatchStackCheckCode) to - // restore the conditional branch. - Address call_target_address = rinfo->pc(); - ASSERT(*(call_target_address - 3) == 0x90 && // nop - *(call_target_address - 2) == 0x90 && // nop - *(call_target_address - 1) == 0xe8); // call - *(call_target_address - 3) = 0x73; // jae - *(call_target_address - 2) = 0x07; // offset - rinfo->set_target_address(check_code->entry()); - } - } +void Deoptimizer::RevertStackCheckCodeAt(Address pc_after, + Code* check_code, + Code* replacement_code) { + Address call_target_address = pc_after - kPointerSize; + ASSERT(replacement_code->entry() == + Assembler::target_address_at(call_target_address)); + // Replace the nops from patching (Deoptimizer::PatchStackCheckCode) to + // restore the conditional branch. + ASSERT(*(call_target_address - 3) == 0x90 && // nop + *(call_target_address - 2) == 0x90 && // nop + *(call_target_address - 1) == 0xe8); // call + *(call_target_address - 3) = 0x73; // jae + *(call_target_address - 2) = 0x07; // offset + Assembler::set_target_address_at(call_target_address, + check_code->entry()); } diff --git a/src/x64/deoptimizer-x64.cc b/src/x64/deoptimizer-x64.cc index 1f7c1ef..708be86 100644 --- a/src/x64/deoptimizer-x64.cc +++ b/src/x64/deoptimizer-x64.cc @@ -107,16 +107,16 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) { } -void Deoptimizer::PatchStackCheckAt(Address pc_after, - Code* check_code, - Code* replacement_code) { +void Deoptimizer::PatchStackCheckCodeAt(Address pc_after, + Code* check_code, + Code* replacement_code) { UNIMPLEMENTED(); } -void Deoptimizer::RevertStackCheckCode(Code* unoptimized_code, - Code* check_code, - Code* replacement_code) { +void Deoptimizer::RevertStackCheckCodeAt(Address pc_after, + Code* check_code, + Code* replacement_code) { UNIMPLEMENTED(); } -- 2.7.4