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

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

Issue 2003553002: [heap] Introduce a new remembered set for typed pointers from old to new. (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 | « src/heap/heap.cc ('k') | src/heap/remembered-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 113518da02e71c6286ad5d120435a61bc2240bb4..1e055374246e8e2ba3713c0493ebe8081ab3979b 100644
--- a/src/heap/mark-compact.cc
+++ b/src/heap/mark-compact.cc
@@ -2823,117 +2823,6 @@ static inline SlotCallbackResult UpdateSlot(Object** slot) {
return REMOVE_SLOT;
}
-// Updates a cell slot using an untyped slot callback.
-// The callback accepts (Heap*, Object**) and returns SlotCallbackResult.
-template <typename Callback>
-static SlotCallbackResult UpdateCell(RelocInfo* rinfo, Callback callback) {
- DCHECK(rinfo->rmode() == RelocInfo::CELL);
- Object* cell = rinfo->target_cell();
- Object* old_cell = cell;
- SlotCallbackResult result = callback(&cell);
- if (cell != old_cell) {
- rinfo->set_target_cell(reinterpret_cast<Cell*>(cell));
- }
- return result;
-}
-
-// Updates a code entry slot using an untyped slot callback.
-// The callback accepts (Heap*, Object**) and returns SlotCallbackResult.
-template <typename Callback>
-static SlotCallbackResult UpdateCodeEntry(Address entry_address,
- Callback callback) {
- Object* code = Code::GetObjectFromEntryAddress(entry_address);
- Object* old_code = code;
- SlotCallbackResult result = callback(&code);
- if (code != old_code) {
- Memory::Address_at(entry_address) = reinterpret_cast<Code*>(code)->entry();
- }
- return result;
-}
-
-// Updates a code target slot using an untyped slot callback.
-// The callback accepts (Heap*, Object**) and returns SlotCallbackResult.
-template <typename Callback>
-static SlotCallbackResult UpdateCodeTarget(RelocInfo* rinfo,
- Callback callback) {
- DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode()));
- Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
- Object* old_target = target;
- SlotCallbackResult result = callback(&target);
- if (target != old_target) {
- rinfo->set_target_address(Code::cast(target)->instruction_start());
- }
- return result;
-}
-
-// Updates an embedded pointer slot using an untyped slot callback.
-// The callback accepts (Heap*, Object**) and returns SlotCallbackResult.
-template <typename Callback>
-static SlotCallbackResult UpdateEmbeddedPointer(RelocInfo* rinfo,
- Callback callback) {
- DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT);
- Object* target = rinfo->target_object();
- Object* old_target = target;
- SlotCallbackResult result = callback(&target);
- if (target != old_target) {
- rinfo->set_target_object(target);
- }
- return result;
-}
-
-// Updates a debug target slot using an untyped slot callback.
-// The callback accepts (Heap*, Object**) and returns SlotCallbackResult.
-template <typename Callback>
-static SlotCallbackResult UpdateDebugTarget(RelocInfo* rinfo,
- Callback callback) {
- DCHECK(RelocInfo::IsDebugBreakSlot(rinfo->rmode()) &&
- rinfo->IsPatchedDebugBreakSlotSequence());
- Object* target = Code::GetCodeFromTargetAddress(rinfo->debug_call_address());
- SlotCallbackResult result = callback(&target);
- rinfo->set_debug_call_address(Code::cast(target)->instruction_start());
- return result;
-}
-
-// Updates a typed slot using an untyped slot callback.
-// The callback accepts (Heap*, Object**) and returns SlotCallbackResult.
-template <typename Callback>
-static SlotCallbackResult UpdateTypedSlot(Isolate* isolate, SlotType slot_type,
- Address addr, Callback callback) {
- switch (slot_type) {
- case CODE_TARGET_SLOT: {
- RelocInfo rinfo(isolate, addr, RelocInfo::CODE_TARGET, 0, NULL);
- return UpdateCodeTarget(&rinfo, callback);
- }
- case CELL_TARGET_SLOT: {
- RelocInfo rinfo(isolate, addr, RelocInfo::CELL, 0, NULL);
- return UpdateCell(&rinfo, callback);
- }
- case CODE_ENTRY_SLOT: {
- return UpdateCodeEntry(addr, callback);
- }
- case DEBUG_TARGET_SLOT: {
- RelocInfo rinfo(isolate, addr, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION, 0,
- NULL);
- if (rinfo.IsPatchedDebugBreakSlotSequence()) {
- return UpdateDebugTarget(&rinfo, callback);
- }
- return REMOVE_SLOT;
- }
- case EMBEDDED_OBJECT_SLOT: {
- RelocInfo rinfo(isolate, addr, RelocInfo::EMBEDDED_OBJECT, 0, NULL);
- return UpdateEmbeddedPointer(&rinfo, callback);
- }
- case OBJECT_SLOT: {
- return callback(reinterpret_cast<Object**>(addr));
- }
- case NUMBER_OF_SLOT_TYPES:
- break;
- }
- UNREACHABLE();
- return REMOVE_SLOT;
-}
-
-
// Visitor for updating pointers from live objects in old spaces to new space.
// It does not expect to encounter pointers to dead objects.
class PointersUpdatingVisitor : public ObjectVisitor {
@@ -2944,22 +2833,24 @@ class PointersUpdatingVisitor : public ObjectVisitor {
for (Object** p = start; p < end; p++) UpdateSlot(p);
}
- void VisitCell(RelocInfo* rinfo) override { UpdateCell(rinfo, UpdateSlot); }
+ void VisitCell(RelocInfo* rinfo) override {
+ UpdateTypedSlotHelper::UpdateCell(rinfo, UpdateSlot);
+ }
void VisitEmbeddedPointer(RelocInfo* rinfo) override {
- UpdateEmbeddedPointer(rinfo, UpdateSlot);
+ UpdateTypedSlotHelper::UpdateEmbeddedPointer(rinfo, UpdateSlot);
}
void VisitCodeTarget(RelocInfo* rinfo) override {
- UpdateCodeTarget(rinfo, UpdateSlot);
+ UpdateTypedSlotHelper::UpdateCodeTarget(rinfo, UpdateSlot);
}
void VisitCodeEntry(Address entry_address) override {
- UpdateCodeEntry(entry_address, UpdateSlot);
+ UpdateTypedSlotHelper::UpdateCodeEntry(entry_address, UpdateSlot);
}
void VisitDebugTarget(RelocInfo* rinfo) override {
- UpdateDebugTarget(rinfo, UpdateSlot);
+ UpdateTypedSlotHelper::UpdateDebugTarget(rinfo, UpdateSlot);
}
};
@@ -3509,6 +3400,7 @@ void MarkCompactCollector::InvalidateCode(Code* code) {
Address start = code->instruction_start();
Address end = code->address() + code->Size();
RememberedSet<OLD_TO_OLD>::RemoveRangeTyped(page, start, end);
+ RememberedSet<OLD_TO_NEW>::RemoveRangeTyped(page, start, end);
}
}
@@ -3681,7 +3573,18 @@ class PointerUpdateJobTraits {
Isolate* isolate = heap->isolate();
RememberedSet<OLD_TO_OLD>::IterateTyped(
chunk, [isolate](SlotType type, Address slot) {
- return UpdateTypedSlot(isolate, type, slot, UpdateSlot);
+ return UpdateTypedSlotHelper::UpdateTypedSlot(isolate, type, slot,
+ UpdateSlot);
+ });
+ } else {
+ Isolate* isolate = heap->isolate();
+ RememberedSet<OLD_TO_NEW>::IterateTyped(
+ chunk, [isolate, heap](SlotType type, Address slot) {
+ return UpdateTypedSlotHelper::UpdateTypedSlot(
+ isolate, type, slot, [heap](Object** slot) {
+ return CheckAndUpdateOldToNewSlot(
ulan 2016/05/23 08:40:08 For separate CL: We would need to force promotion
+ heap, reinterpret_cast<Address>(slot));
+ });
});
}
}
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/remembered-set.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698