Commit e35e8c9d authored by mlippautz's avatar mlippautz Committed by Commit bot

Revert of [heap] Unify evacuating an object for new and old generation....

Revert of [heap] Unify evacuating an object for new and old generation. (patchset #1 id:1 of https://codereview.chromium.org/1494533002/ )

Reason for revert:
Speculative revert for crashing Canary.

Original issue's description:
> Reland of [heap] Unify evacuating an object for new and old generation. (patchset #1 id:1 of https://codereview.chromium.org/1483963004/ )
>
> Reason for revert:
> Reland after fixing the potential root cause of the canary crasher.
>
> Original issue's description:
> > Revert of [heap] Unify evacuating an object for new and old generation. (patchset #2 id:20001 of https://codereview.chromium.org/1481873002/ )
> >
> > Reason for revert:
> > Still investigating bad canary.
> >
> > Original issue's description:
> > > [heap] Unify evacuating an object for new and old generation.
> > >
> > > BUG=chromium:524425
> > > LOG=N
> > >
> > > Committed: https://crrev.com/afb8bcce8ba889280ed747eb218d287ddd233b4a
> > > Cr-Commit-Position: refs/heads/master@{#32365}
> >
> > TBR=mlippautz@chromium.org
> > NOPRESUBMIT=true
> > NOTREECHECKS=true
> > NOTRY=true
> > BUG=chromium:524425
> >
> > Committed: https://crrev.com/9c60ddc60e96da0c59e646660789c26550ad52a2
> > Cr-Commit-Position: refs/heads/master@{#32460}
>
> TBR=mlippautz@chromium.org
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=chromium:524425
>
> Committed: https://crrev.com/7ea8ac98f6eb5ffa9d4976aa22fec9befb814e0c
> Cr-Commit-Position: refs/heads/master@{#32501}

TBR=hpayer@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=chromium:524425

Review URL: https://codereview.chromium.org/1491013003

Cr-Commit-Position: refs/heads/master@{#32521}
parent 23227681
...@@ -1532,51 +1532,18 @@ class MarkCompactCollector::HeapObjectVisitor { ...@@ -1532,51 +1532,18 @@ class MarkCompactCollector::HeapObjectVisitor {
}; };
class MarkCompactCollector::EvacuateVisitorBase
: public MarkCompactCollector::HeapObjectVisitor {
public:
EvacuateVisitorBase(Heap* heap, SlotsBuffer** evacuation_slots_buffer)
: heap_(heap), evacuation_slots_buffer_(evacuation_slots_buffer) {}
bool TryEvacuateObject(PagedSpace* target_space, HeapObject* object,
HeapObject** target_object) {
int size = object->Size();
AllocationAlignment alignment = object->RequiredAlignment();
AllocationResult allocation = target_space->AllocateRaw(size, alignment);
if (allocation.To(target_object)) {
heap_->mark_compact_collector()->MigrateObject(
*target_object, object, size, target_space->identity(),
evacuation_slots_buffer_);
return true;
}
return false;
}
protected:
Heap* heap_;
SlotsBuffer** evacuation_slots_buffer_;
};
class MarkCompactCollector::EvacuateNewSpaceVisitor class MarkCompactCollector::EvacuateNewSpaceVisitor
: public MarkCompactCollector::EvacuateVisitorBase { : public MarkCompactCollector::HeapObjectVisitor {
public: public:
explicit EvacuateNewSpaceVisitor(Heap* heap, explicit EvacuateNewSpaceVisitor(Heap* heap) : heap_(heap) {}
SlotsBuffer** evacuation_slots_buffer)
: EvacuateVisitorBase(heap, evacuation_slots_buffer) {}
virtual bool Visit(HeapObject* object) { virtual bool Visit(HeapObject* object) {
Heap::UpdateAllocationSiteFeedback(object, Heap::RECORD_SCRATCHPAD_SLOT); Heap::UpdateAllocationSiteFeedback(object, Heap::RECORD_SCRATCHPAD_SLOT);
int size = object->Size(); int size = object->Size();
HeapObject* target_object = nullptr;
// TODO(hpayer): Refactor EvacuateObject and call this function instead.
if (heap_->ShouldBePromoted(object->address(), size) && if (heap_->ShouldBePromoted(object->address(), size) &&
TryEvacuateObject(heap_->old_space(), object, &target_object)) { heap_->mark_compact_collector()->TryPromoteObject(object, size)) {
// If we end up needing more special cases, we should factor this out.
if (V8_UNLIKELY(target_object->IsJSArrayBuffer())) {
heap_->array_buffer_tracker()->Promote(
JSArrayBuffer::cast(target_object));
}
heap_->IncrementPromotedObjectsSize(size);
return true; return true;
} }
...@@ -1603,31 +1570,43 @@ class MarkCompactCollector::EvacuateNewSpaceVisitor ...@@ -1603,31 +1570,43 @@ class MarkCompactCollector::EvacuateNewSpaceVisitor
heap_->IncrementSemiSpaceCopiedObjectSize(size); heap_->IncrementSemiSpaceCopiedObjectSize(size);
return true; return true;
} }
private:
Heap* heap_;
}; };
class MarkCompactCollector::EvacuateOldSpaceVisitor class MarkCompactCollector::EvacuateOldSpaceVisitor
: public MarkCompactCollector::EvacuateVisitorBase { : public MarkCompactCollector::HeapObjectVisitor {
public: public:
EvacuateOldSpaceVisitor(Heap* heap, EvacuateOldSpaceVisitor(Heap* heap,
CompactionSpaceCollection* compaction_spaces, CompactionSpaceCollection* compaction_spaces,
SlotsBuffer** evacuation_slots_buffer) SlotsBuffer** evacuation_slots_buffer)
: EvacuateVisitorBase(heap, evacuation_slots_buffer), : heap_(heap),
compaction_spaces_(compaction_spaces) {} compaction_spaces_(compaction_spaces),
evacuation_slots_buffer_(evacuation_slots_buffer) {}
virtual bool Visit(HeapObject* object) { virtual bool Visit(HeapObject* object) {
CompactionSpace* target_space = compaction_spaces_->Get( int size = object->Size();
Page::FromAddress(object->address())->owner()->identity()); AllocationAlignment alignment = object->RequiredAlignment();
HeapObject* target_object = nullptr; HeapObject* target_object = nullptr;
if (TryEvacuateObject(target_space, object, &target_object)) { AllocationSpace id =
DCHECK(object->map_word().IsForwardingAddress()); Page::FromAddress(object->address())->owner()->identity();
return true; AllocationResult allocation =
compaction_spaces_->Get(id)->AllocateRaw(size, alignment);
if (!allocation.To(&target_object)) {
return false;
} }
return false; heap_->mark_compact_collector()->MigrateObject(
target_object, object, size, id, evacuation_slots_buffer_);
DCHECK(object->map_word().IsForwardingAddress());
return true;
} }
private: private:
Heap* heap_;
CompactionSpaceCollection* compaction_spaces_; CompactionSpaceCollection* compaction_spaces_;
SlotsBuffer** evacuation_slots_buffer_;
}; };
...@@ -2987,6 +2966,28 @@ static String* UpdateReferenceInExternalStringTableEntry(Heap* heap, ...@@ -2987,6 +2966,28 @@ static String* UpdateReferenceInExternalStringTableEntry(Heap* heap,
} }
bool MarkCompactCollector::TryPromoteObject(HeapObject* object,
int object_size) {
OldSpace* old_space = heap()->old_space();
HeapObject* target = nullptr;
AllocationAlignment alignment = object->RequiredAlignment();
AllocationResult allocation = old_space->AllocateRaw(object_size, alignment);
if (allocation.To(&target)) {
MigrateObject(target, object, object_size, old_space->identity(),
&migration_slots_buffer_);
// If we end up needing more special cases, we should factor this out.
if (V8_UNLIKELY(target->IsJSArrayBuffer())) {
heap()->array_buffer_tracker()->Promote(JSArrayBuffer::cast(target));
}
heap()->IncrementPromotedObjectsSize(object_size);
return true;
}
return false;
}
bool MarkCompactCollector::IsSlotInBlackObject(Page* p, Address slot, bool MarkCompactCollector::IsSlotInBlackObject(Page* p, Address slot,
HeapObject** out_object) { HeapObject** out_object) {
Space* owner = p->owner(); Space* owner = p->owner();
...@@ -3159,7 +3160,7 @@ void MarkCompactCollector::EvacuateNewSpace() { ...@@ -3159,7 +3160,7 @@ void MarkCompactCollector::EvacuateNewSpace() {
// new entries in the store buffer and may cause some pages to be marked // new entries in the store buffer and may cause some pages to be marked
// scan-on-scavenge. // scan-on-scavenge.
NewSpacePageIterator it(from_bottom, from_top); NewSpacePageIterator it(from_bottom, from_top);
EvacuateNewSpaceVisitor new_space_visitor(heap(), &migration_slots_buffer_); EvacuateNewSpaceVisitor new_space_visitor(heap());
while (it.has_next()) { while (it.has_next()) {
NewSpacePage* p = it.next(); NewSpacePage* p = it.next();
survivors_size += p->LiveBytes(); survivors_size += p->LiveBytes();
......
...@@ -319,6 +319,10 @@ class MarkCompactCollector { ...@@ -319,6 +319,10 @@ class MarkCompactCollector {
kClearMarkbits, kClearMarkbits,
}; };
class EvacuateNewSpaceVisitor;
class EvacuateOldSpaceVisitor;
class HeapObjectVisitor;
static void Initialize(); static void Initialize();
void SetUp(); void SetUp();
...@@ -405,6 +409,8 @@ class MarkCompactCollector { ...@@ -405,6 +409,8 @@ class MarkCompactCollector {
AllocationSpace to_old_space, AllocationSpace to_old_space,
SlotsBuffer** evacuation_slots_buffer); SlotsBuffer** evacuation_slots_buffer);
bool TryPromoteObject(HeapObject* object, int object_size);
void InvalidateCode(Code* code); void InvalidateCode(Code* code);
void ClearMarkbits(); void ClearMarkbits();
...@@ -502,10 +508,6 @@ class MarkCompactCollector { ...@@ -502,10 +508,6 @@ class MarkCompactCollector {
private: private:
class CompactionTask; class CompactionTask;
class EvacuateNewSpaceVisitor;
class EvacuateOldSpaceVisitor;
class EvacuateVisitorBase;
class HeapObjectVisitor;
class SweeperTask; class SweeperTask;
explicit MarkCompactCollector(Heap* heap); explicit MarkCompactCollector(Heap* heap);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment