Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index cd0fd9c499dfd2fbf03dbb3fca47bab76a33e59a..4e9fdc864c171a1db30eae0df8cf2443c75354bb 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -1569,9 +1569,6 @@ |
DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode())); |
Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
Code* host = rinfo->host(); |
- // The target is always in old space, we don't have to record the slot in |
- // the old-to-new remembered set. |
- DCHECK(!collector_->heap()->InNewSpace(target)); |
collector_->RecordRelocSlot(host, rinfo, target); |
} |
@@ -1580,9 +1577,6 @@ |
rinfo->IsPatchedDebugBreakSlotSequence()); |
Code* target = Code::GetCodeFromTargetAddress(rinfo->debug_call_address()); |
Code* host = rinfo->host(); |
- // The target is always in old space, we don't have to record the slot in |
- // the old-to-new remembered set. |
- DCHECK(!collector_->heap()->InNewSpace(target)); |
collector_->RecordRelocSlot(host, rinfo, target); |
} |
@@ -1590,7 +1584,6 @@ |
DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
HeapObject* object = HeapObject::cast(rinfo->target_object()); |
Code* host = rinfo->host(); |
- collector_->heap()->RecordWriteIntoCode(host, rinfo, object); |
collector_->RecordRelocSlot(host, rinfo, object); |
} |
@@ -1598,9 +1591,6 @@ |
DCHECK(rinfo->rmode() == RelocInfo::CELL); |
Cell* cell = rinfo->target_cell(); |
Code* host = rinfo->host(); |
- // The cell is always in old space, we don't have to record the slot in |
- // the old-to-new remembered set. |
- DCHECK(!collector_->heap()->InNewSpace(cell)); |
collector_->RecordRelocSlot(host, rinfo, cell); |
} |
@@ -2464,35 +2454,6 @@ |
have_code_to_deoptimize_ |= current->MarkCodeForDeoptimization( |
isolate, DependentCode::kWeakCodeGroup); |
current = current->next_link(); |
- } |
- |
- { |
- ArrayList* list = heap_->weak_new_space_object_to_code_list(); |
- int counter = 0; |
- for (int i = 0; i < list->Length(); i += 2) { |
- WeakCell* obj = WeakCell::cast(list->Get(i)); |
- WeakCell* dep = WeakCell::cast(list->Get(i + 1)); |
- if (obj->cleared() || dep->cleared()) { |
- if (!dep->cleared()) { |
- Code* code = Code::cast(dep->value()); |
- if (!code->marked_for_deoptimization()) { |
- DependentCode::SetMarkedForDeoptimization( |
- code, DependentCode::DependencyGroup::kWeakCodeGroup); |
- code->InvalidateEmbeddedObjects(); |
- have_code_to_deoptimize_ = true; |
- } |
- } |
- } else { |
- // We record the slot manually because marking is finished at this |
- // point and the write barrier would bailout. |
- list->Set(counter, obj, SKIP_WRITE_BARRIER); |
- RecordSlot(list, list->Slot(counter), obj); |
- counter++; |
- list->Set(counter, dep, SKIP_WRITE_BARRIER); |
- RecordSlot(list, list->Slot(counter), dep); |
- counter++; |
- } |
- } |
} |
WeakHashTable* table = heap_->weak_object_to_code_table(); |
@@ -2839,16 +2800,30 @@ |
heap()->set_encountered_transition_arrays(Smi::FromInt(0)); |
} |
+static inline SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { |
+ if (RelocInfo::IsCodeTarget(rmode)) { |
+ return CODE_TARGET_SLOT; |
+ } else if (RelocInfo::IsCell(rmode)) { |
+ return CELL_TARGET_SLOT; |
+ } else if (RelocInfo::IsEmbeddedObject(rmode)) { |
+ return EMBEDDED_OBJECT_SLOT; |
+ } else if (RelocInfo::IsDebugBreakSlot(rmode)) { |
+ return DEBUG_TARGET_SLOT; |
+ } |
+ UNREACHABLE(); |
+ return NUMBER_OF_SLOT_TYPES; |
+} |
+ |
void MarkCompactCollector::RecordRelocSlot(Code* host, RelocInfo* rinfo, |
Object* target) { |
Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); |
Page* source_page = Page::FromAddress(reinterpret_cast<Address>(host)); |
+ RelocInfo::Mode rmode = rinfo->rmode(); |
if (target_page->IsEvacuationCandidate() && |
(rinfo->host() == NULL || |
!ShouldSkipEvacuationSlotRecording(rinfo->host()))) { |
- RelocInfo::Mode rmode = rinfo->rmode(); |
Address addr = rinfo->pc(); |
- SlotType slot_type = SlotTypeForRelocInfoMode(rmode); |
+ SlotType slot_type = SlotTypeForRMode(rmode); |
if (rinfo->IsInConstantPool()) { |
addr = rinfo->constant_pool_entry_address(); |
if (RelocInfo::IsCodeTarget(rmode)) { |
@@ -3472,12 +3447,6 @@ |
} |
void MarkCompactCollector::InvalidateCode(Code* code) { |
- Page* page = Page::FromAddress(code->address()); |
- Address start = code->instruction_start(); |
- Address end = code->address() + code->Size(); |
- |
- RememberedSet<OLD_TO_NEW>::RemoveRangeTyped(page, start, end); |
- |
if (heap_->incremental_marking()->IsCompacting() && |
!ShouldSkipEvacuationSlotRecording(code)) { |
DCHECK(compacting_); |
@@ -3489,7 +3458,11 @@ |
// Ignore all slots that might have been recorded in the body of the |
// deoptimized code object. Assumption: no slots will be recorded for |
// this object after invalidating it. |
+ Page* page = Page::FromAddress(code->address()); |
+ 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); |
} |
} |
@@ -4090,9 +4063,6 @@ |
MarkBit mark_bit = Marking::MarkBitFrom(host); |
if (Marking::IsBlack(mark_bit)) { |
RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); |
- // The target is always in old space, we don't have to record the slot in |
- // the old-to-new remembered set. |
- DCHECK(!heap()->InNewSpace(target)); |
RecordRelocSlot(host, &rinfo, target); |
} |
} |