Index: src/x64/assembler-x64-inl.h |
diff --git a/src/x64/assembler-x64-inl.h b/src/x64/assembler-x64-inl.h |
index d022340c10a636ac66b2816690c4d24dc718512e..63ba58bcb18a3d4cb9d13dd3e728886321dddf2e 100644 |
--- a/src/x64/assembler-x64-inl.h |
+++ b/src/x64/assembler-x64-inl.h |
@@ -42,6 +42,9 @@ namespace internal { |
// Implementation of Assembler |
+static const byte kCallOpcode = 0xE8; |
+ |
+ |
void Assembler::emitl(uint32_t x) { |
Memory::uint32_at(pc_) = x; |
pc_ += sizeof(uint32_t); |
@@ -217,6 +220,12 @@ void RelocInfo::apply(intptr_t delta) { |
} else if (IsCodeTarget(rmode_)) { |
Memory::int32_at(pc_) -= static_cast<int32_t>(delta); |
CPU::FlushICache(pc_, sizeof(int32_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)); |
+ } |
} |
} |
@@ -355,6 +364,21 @@ bool RelocInfo::IsPatchedDebugBreakSlotSequence() { |
} |
+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())); |
@@ -408,6 +432,8 @@ void RelocInfo::Visit(ObjectVisitor* visitor) { |
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
visitor->VisitExternalReference(this); |
CPU::FlushICache(pc_, sizeof(Address)); |
+ } else if (RelocInfo::IsCodeAgeSequence(mode)) { |
+ visitor->VisitCodeAgeSequence(this); |
#ifdef ENABLE_DEBUGGER_SUPPORT |
// TODO(isolates): Get a cached isolate below. |
} else if (((RelocInfo::IsJSReturn(mode) && |
@@ -436,6 +462,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) && |