Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index ad0c58e4a8d53e61c5c459caec33d9299184d065..f98d2618091169c404a948462982bb1f40da0b98 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -1533,6 +1533,9 @@ void MarkCompactCollector::DiscoverGreyObjectsOnPage(MemoryChunk* p) { |
class RecordMigratedSlotVisitor final : public ObjectVisitor { |
public: |
+ explicit RecordMigratedSlotVisitor(MarkCompactCollector* collector) |
+ : collector_(collector) {} |
+ |
inline void VisitPointer(Object** p) final { |
RecordMigratedSlot(*p, reinterpret_cast<Address>(p)); |
} |
@@ -1552,6 +1555,54 @@ class RecordMigratedSlotVisitor final : public ObjectVisitor { |
} |
} |
+ inline void VisitCodeTarget(RelocInfo* rinfo) final { |
+ DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode())); |
+ Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
+ Code* host = rinfo->host(); |
+ collector_->RecordRelocSlot(host, rinfo, target); |
+ } |
+ |
+ inline void VisitDebugTarget(RelocInfo* rinfo) final { |
+ DCHECK(RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && |
+ rinfo->IsPatchedDebugBreakSlotSequence()); |
+ Code* target = Code::GetCodeFromTargetAddress(rinfo->debug_call_address()); |
+ Code* host = rinfo->host(); |
+ collector_->RecordRelocSlot(host, rinfo, target); |
+ } |
+ |
+ inline void VisitEmbeddedPointer(RelocInfo* rinfo) final { |
+ DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
+ HeapObject* object = HeapObject::cast(rinfo->target_object()); |
+ Code* host = rinfo->host(); |
+ collector_->RecordRelocSlot(host, rinfo, object); |
+ } |
+ |
+ inline void VisitCell(RelocInfo* rinfo) final { |
+ DCHECK(rinfo->rmode() == RelocInfo::CELL); |
+ Cell* cell = rinfo->target_cell(); |
+ Code* host = rinfo->host(); |
+ collector_->RecordRelocSlot(host, rinfo, cell); |
+ } |
+ |
+ // Entries that will never move. |
+ inline void VisitCodeAgeSequence(RelocInfo* rinfo) final { |
+ DCHECK(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); |
+ Code* stub = rinfo->code_age_stub(); |
+ USE(stub); |
+ DCHECK(!Page::FromAddress(stub->address())->IsEvacuationCandidate()); |
+ } |
+ |
+ // Entries that are skipped for recording. |
+ inline void VisitExternalReference(RelocInfo* rinfo) final {} |
+ inline void VisitExternalReference(Address* p) final {} |
+ inline void VisitRuntimeEntry(RelocInfo* rinfo) final {} |
+ inline void VisitExternalOneByteString( |
+ v8::String::ExternalOneByteStringResource** resource) final {} |
+ inline void VisitExternalTwoByteString( |
+ v8::String::ExternalStringResource** resource) final {} |
+ inline void VisitInternalReference(RelocInfo* rinfo) final {} |
+ inline void VisitEmbedderReference(Object** p, uint16_t class_id) final {} |
+ |
private: |
inline void RecordMigratedSlot(Object* value, Address slot) { |
if (value->IsHeapObject()) { |
@@ -1563,6 +1614,8 @@ class RecordMigratedSlotVisitor final : public ObjectVisitor { |
} |
} |
} |
+ |
+ MarkCompactCollector* collector_; |
}; |
class MarkCompactCollector::HeapObjectVisitor { |
@@ -1620,7 +1673,7 @@ class MarkCompactCollector::EvacuateVisitorBase |
PROFILE(heap_->isolate(), |
CodeMoveEvent(AbstractCode::cast(src), dst_addr)); |
} |
- RecordMigratedSlotVisitor visitor; |
+ RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
dst->IterateBodyFast(dst->map()->instance_type(), size, &visitor); |
} else if (dest == CODE_SPACE) { |
DCHECK_CODEOBJECT_SIZE(size, heap_->code_space()); |
@@ -1629,9 +1682,9 @@ class MarkCompactCollector::EvacuateVisitorBase |
CodeMoveEvent(AbstractCode::cast(src), dst_addr)); |
} |
heap_->CopyBlock(dst_addr, src_addr, size); |
- RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(dst_addr), |
- RELOCATED_CODE_OBJECT, dst_addr); |
Code::cast(dst)->Relocate(dst_addr - src_addr); |
+ RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
+ dst->IterateBodyFast(dst->map()->instance_type(), size, &visitor); |
} else { |
DCHECK_OBJECT_SIZE(size); |
DCHECK(dest == NEW_SPACE); |
@@ -1799,7 +1852,8 @@ class MarkCompactCollector::EvacuateNewSpaceVisitor final |
class MarkCompactCollector::EvacuateNewSpacePageVisitor final |
: public MarkCompactCollector::HeapObjectVisitor { |
public: |
- EvacuateNewSpacePageVisitor() : promoted_size_(0) {} |
+ explicit EvacuateNewSpacePageVisitor(Heap* heap) |
+ : heap_(heap), promoted_size_(0) {} |
static void TryMoveToOldSpace(Page* page, PagedSpace* owner) { |
if (page->heap()->new_space()->ReplaceWithEmptyPage(page)) { |
@@ -1813,7 +1867,7 @@ class MarkCompactCollector::EvacuateNewSpacePageVisitor final |
object->GetHeap()->array_buffer_tracker()->Promote( |
JSArrayBuffer::cast(object)); |
} |
- RecordMigratedSlotVisitor visitor; |
+ RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
object->IterateBodyFast(&visitor); |
promoted_size_ += object->Size(); |
return true; |
@@ -1822,6 +1876,7 @@ class MarkCompactCollector::EvacuateNewSpacePageVisitor final |
intptr_t promoted_size() { return promoted_size_; } |
private: |
+ Heap* heap_; |
intptr_t promoted_size_; |
}; |
@@ -1847,24 +1902,16 @@ class MarkCompactCollector::EvacuateOldSpaceVisitor final |
class MarkCompactCollector::EvacuateRecordOnlyVisitor final |
: public MarkCompactCollector::HeapObjectVisitor { |
public: |
- explicit EvacuateRecordOnlyVisitor(AllocationSpace space) : space_(space) {} |
+ explicit EvacuateRecordOnlyVisitor(Heap* heap) : heap_(heap) {} |
inline bool Visit(HeapObject* object) { |
- if (space_ == OLD_SPACE) { |
- RecordMigratedSlotVisitor visitor; |
- object->IterateBody(&visitor); |
- } else { |
- DCHECK_EQ(space_, CODE_SPACE); |
- // Add a typed slot for the whole code object. |
- RememberedSet<OLD_TO_OLD>::InsertTyped( |
- Page::FromAddress(object->address()), RELOCATED_CODE_OBJECT, |
- object->address()); |
- } |
+ RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
+ object->IterateBody(&visitor); |
return true; |
} |
private: |
- AllocationSpace space_; |
+ Heap* heap_; |
}; |
void MarkCompactCollector::DiscoverGreyObjectsInSpace(PagedSpace* space) { |
@@ -2769,11 +2816,6 @@ static inline void UpdateTypedSlot(Isolate* isolate, ObjectVisitor* v, |
v->VisitCodeEntry(addr); |
break; |
} |
- case RELOCATED_CODE_OBJECT: { |
- HeapObject* obj = HeapObject::FromAddress(addr); |
- Code::BodyDescriptor::IterateBody(obj, v); |
- break; |
- } |
case DEBUG_TARGET_SLOT: { |
RelocInfo rinfo(isolate, addr, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION, 0, |
NULL); |
@@ -3061,7 +3103,7 @@ class MarkCompactCollector::Evacuator : public Malloced { |
kInitialLocalPretenuringFeedbackCapacity), |
new_space_visitor_(collector->heap(), &compaction_spaces_, |
&local_pretenuring_feedback_), |
- new_space_page_visitor(), |
+ new_space_page_visitor(collector->heap()), |
old_space_visitor_(collector->heap(), &compaction_spaces_), |
duration_(0.0), |
bytes_compacted_(0) {} |
@@ -3172,7 +3214,7 @@ bool MarkCompactCollector::Evacuator::EvacuatePage(Page* page) { |
if (!result) { |
// Aborted compaction page. We can record slots here to have them |
// processed in parallel later on. |
- EvacuateRecordOnlyVisitor record_visitor(page->owner()->identity()); |
+ EvacuateRecordOnlyVisitor record_visitor(collector_->heap()); |
result = EvacuateSinglePage<kKeepMarking>(page, &record_visitor); |
DCHECK(result); |
USE(result); |