Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(369)

Unified Diff: src/heap/mark-compact.cc

Issue 1994653002: [heap] Replace RELOCATED_CODE_OBJECT with proper recording (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/heap/slot-set.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « no previous file | src/heap/slot-set.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698