Index: src/ia32/assembler-ia32-inl.h |
diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h |
index 0b47748d6b464556c0383d5ac6d2ca1bb3e3d672..e09703fbd820daf4afce44d877ff71a94fabfcb0 100644 |
--- a/src/ia32/assembler-ia32-inl.h |
+++ b/src/ia32/assembler-ia32-inl.h |
@@ -45,6 +45,7 @@ |
namespace v8 { |
namespace internal { |
+static const byte kCallOpcode = 0xE8; |
// The modes possibly affected by apply must be in kApplyMask. |
void RelocInfo::apply(intptr_t delta) { |
@@ -52,6 +53,12 @@ void RelocInfo::apply(intptr_t delta) { |
int32_t* p = reinterpret_cast<int32_t*>(pc_); |
*p -= delta; // Relocate entry. |
CPU::FlushICache(p, sizeof(uint32_t)); |
+ } else if (rmode_ == CODE_AGE_SEQUENCE) { |
+ if (*pc_ == kCallOpcode) { |
+ int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1); |
+ *p -= delta; // Relocate entry. |
+ CPU::FlushICache(p, sizeof(uint32_t)); |
+ } |
} else if (rmode_ == JS_RETURN && IsPatchedReturnSequence()) { |
// Special handling of js_return when a break point is set (call |
// instruction has been inserted). |
@@ -169,6 +176,21 @@ void RelocInfo::set_target_cell(JSGlobalPropertyCell* cell, |
} |
+Code* RelocInfo::code_age_stub() { |
Michael Starzinger
2012/09/21 09:43:19
ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
danno
2012/10/25 10:07:23
Done.
|
+ if (*pc_ == kCallOpcode) { |
+ return Code::GetCodeFromTargetAddress( |
+ Assembler::target_address_at(pc_ + 1)); |
+ } else { |
+ return NULL; |
+ } |
+} |
+ |
+ |
+void RelocInfo::set_code_age_stub(Code* stub) { |
Michael Starzinger
2012/09/21 09:43:19
ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
danno
2012/10/25 10:07:23
Done.
|
+ Assembler::set_target_address_at(pc_ + 1, stub->instruction_start()); |
+} |
+ |
+ |
Address RelocInfo::call_address() { |
ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
@@ -206,7 +228,7 @@ Object** RelocInfo::call_object_address() { |
bool RelocInfo::IsPatchedReturnSequence() { |
- return *pc_ == 0xE8; |
+ return *pc_ == kCallOpcode; |
} |
@@ -227,7 +249,9 @@ void RelocInfo::Visit(ObjectVisitor* visitor) { |
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
visitor->VisitExternalReference(this); |
CPU::FlushICache(pc_, sizeof(Address)); |
-#ifdef ENABLE_DEBUGGER_SUPPORT |
+ } else if (RelocInfo::IsCodeAgeSequence(mode)) { |
+ visitor->VisitCodeAgeSequence(this); |
+ #ifdef ENABLE_DEBUGGER_SUPPORT |
// TODO(isolates): Get a cached isolate below. |
} else if (((RelocInfo::IsJSReturn(mode) && |
IsPatchedReturnSequence()) || |
@@ -255,6 +279,8 @@ void RelocInfo::Visit(Heap* heap) { |
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
StaticVisitor::VisitExternalReference(this); |
CPU::FlushICache(pc_, sizeof(Address)); |
+ } else if (RelocInfo::IsCodeAgeSequence(mode)) { |
+ StaticVisitor::VisitCodeAgeSequence(heap, this); |
#ifdef ENABLE_DEBUGGER_SUPPORT |
} else if (heap->isolate()->debug()->has_break_points() && |
((RelocInfo::IsJSReturn(mode) && |