Index: src/ia32/assembler-ia32-inl.h |
diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h |
index 7fdf50c7a1e026cab03685ffbb7acccbea348c42..114f8784214401960492f92320ab2a76e013dc1e 100644 |
--- a/src/ia32/assembler-ia32-inl.h |
+++ b/src/ia32/assembler-ia32-inl.h |
@@ -46,12 +46,21 @@ 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) { |
if (rmode_ == RUNTIME_ENTRY || IsCodeTarget(rmode_)) { |
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 +178,21 @@ void RelocInfo::set_target_cell(JSGlobalPropertyCell* cell, |
} |
+Code* RelocInfo::code_age_stub() { |
+ ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
+ ASSERT(*pc_ == kCallOpcode); |
+ return Code::GetCodeFromTargetAddress( |
+ Assembler::target_address_at(pc_ + 1)); |
+} |
+ |
+ |
+void RelocInfo::set_code_age_stub(Code* stub) { |
+ ASSERT(*pc_ == kCallOpcode); |
+ ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
+ Assembler::set_target_address_at(pc_ + 1, stub->instruction_start()); |
+} |
+ |
+ |
Address RelocInfo::call_address() { |
ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
@@ -206,7 +230,7 @@ Object** RelocInfo::call_object_address() { |
bool RelocInfo::IsPatchedReturnSequence() { |
- return *pc_ == 0xE8; |
+ return *pc_ == kCallOpcode; |
} |
@@ -227,7 +251,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 +281,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) && |