Revision: 9475
Author: [email protected]
Date: Wed Sep 28 10:45:58 2011
Log: Pass correct anchor_slot for EMBEDDED_OBJECT pointers from code
objects.
Correctly initialize newly created large-object pages when incremental
marking with compaction is in progress.
[email protected]
BUG=v8:1737
Review URL: http://codereview.chromium.org/8070002
http://code.google.com/p/v8/source/detail?r=9475
Modified:
/branches/bleeding_edge/src/arm/assembler-arm-inl.h
/branches/bleeding_edge/src/ia32/assembler-ia32-inl.h
/branches/bleeding_edge/src/incremental-marking.cc
/branches/bleeding_edge/src/incremental-marking.h
/branches/bleeding_edge/src/mark-compact.cc
/branches/bleeding_edge/src/mips/assembler-mips-inl.h
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/src/x64/assembler-x64-inl.h
=======================================
--- /branches/bleeding_edge/src/arm/assembler-arm-inl.h Mon Sep 19 11:36:47
2011
+++ /branches/bleeding_edge/src/arm/assembler-arm-inl.h Wed Sep 28 10:45:58
2011
@@ -215,7 +215,7 @@
void RelocInfo::Visit(ObjectVisitor* visitor) {
RelocInfo::Mode mode = rmode();
if (mode == RelocInfo::EMBEDDED_OBJECT) {
- visitor->VisitPointer(target_object_address());
+ visitor->VisitEmbeddedPointer(host(), target_object_address());
} else if (RelocInfo::IsCodeTarget(mode)) {
visitor->VisitCodeTarget(this);
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
@@ -241,7 +241,7 @@
void RelocInfo::Visit(Heap* heap) {
RelocInfo::Mode mode = rmode();
if (mode == RelocInfo::EMBEDDED_OBJECT) {
- StaticVisitor::VisitPointer(heap, target_object_address());
+ StaticVisitor::VisitEmbeddedPointer(heap, host(),
target_object_address());
} else if (RelocInfo::IsCodeTarget(mode)) {
StaticVisitor::VisitCodeTarget(heap, this);
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32-inl.h Mon Sep 19
11:36:47 2011
+++ /branches/bleeding_edge/src/ia32/assembler-ia32-inl.h Wed Sep 28
10:45:58 2011
@@ -214,7 +214,7 @@
void RelocInfo::Visit(ObjectVisitor* visitor) {
RelocInfo::Mode mode = rmode();
if (mode == RelocInfo::EMBEDDED_OBJECT) {
- visitor->VisitPointer(target_object_address());
+ visitor->VisitEmbeddedPointer(host(), target_object_address());
CPU::FlushICache(pc_, sizeof(Address));
} else if (RelocInfo::IsCodeTarget(mode)) {
visitor->VisitCodeTarget(this);
@@ -242,7 +242,7 @@
void RelocInfo::Visit(Heap* heap) {
RelocInfo::Mode mode = rmode();
if (mode == RelocInfo::EMBEDDED_OBJECT) {
- StaticVisitor::VisitPointer(heap, target_object_address());
+ StaticVisitor::VisitEmbeddedPointer(heap, host(),
target_object_address());
CPU::FlushICache(pc_, sizeof(Address));
} else if (RelocInfo::IsCodeTarget(mode)) {
StaticVisitor::VisitCodeTarget(heap, this);
=======================================
--- /branches/bleeding_edge/src/incremental-marking.cc Thu Sep 22 09:01:35
2011
+++ /branches/bleeding_edge/src/incremental-marking.cc Wed Sep 28 10:45:58
2011
@@ -114,6 +114,17 @@
: heap_(heap),
incremental_marking_(incremental_marking) {
}
+
+ void VisitEmbeddedPointer(Code* host, Object** p) {
+ Object* obj = *p;
+ if (obj->NonFailureIsHeapObject()) {
+ heap_->mark_compact_collector()->RecordSlot(
+ reinterpret_cast<Object**>(host),
+ p,
+ obj);
+ MarkObject(obj);
+ }
+ }
void VisitCodeTarget(RelocInfo* rinfo) {
ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
@@ -218,10 +229,18 @@
void IncrementalMarking::SetOldSpacePageFlags(MemoryChunk* chunk,
- bool is_marking) {
+ bool is_marking,
+ bool is_compacting) {
if (is_marking) {
chunk->SetFlag(MemoryChunk::POINTERS_TO_HERE_ARE_INTERESTING);
chunk->SetFlag(MemoryChunk::POINTERS_FROM_HERE_ARE_INTERESTING);
+
+ // It's difficult to filter out slots recorded for large objects.
+ if (chunk->owner()->identity() == LO_SPACE &&
+ chunk->size() > static_cast<size_t>(Page::kPageSize) &&
+ is_compacting) {
+ chunk->SetFlag(MemoryChunk::RESCAN_ON_EVACUATION);
+ }
} else if (chunk->owner()->identity() == CELL_SPACE ||
chunk->scan_on_scavenge()) {
chunk->ClearFlag(MemoryChunk::POINTERS_TO_HERE_ARE_INTERESTING);
@@ -250,7 +269,7 @@
PageIterator it(space);
while (it.has_next()) {
Page* p = it.next();
- SetOldSpacePageFlags(p, false);
+ SetOldSpacePageFlags(p, false, false);
}
}
@@ -275,7 +294,7 @@
LargePage* lop = heap_->lo_space()->first_page();
while (lop->is_valid()) {
- SetOldSpacePageFlags(lop, false);
+ SetOldSpacePageFlags(lop, false, false);
lop = lop->next_page();
}
}
@@ -285,7 +304,7 @@
PageIterator it(space);
while (it.has_next()) {
Page* p = it.next();
- SetOldSpacePageFlags(p, true);
+ SetOldSpacePageFlags(p, true, is_compacting_);
}
}
@@ -309,7 +328,7 @@
LargePage* lop = heap_->lo_space()->first_page();
while (lop->is_valid()) {
- SetOldSpacePageFlags(lop, true);
+ SetOldSpacePageFlags(lop, true, is_compacting_);
lop = lop->next_page();
}
}
@@ -452,19 +471,6 @@
// when we finish marking.
MarkObjectGreyDoNotEnqueue(heap_->polymorphic_code_cache());
}
-
- if (is_compacting_) {
- // It's difficult to filter out slots recorded for large objects.
- LargeObjectIterator it(heap_->lo_space());
- for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
- if (obj->IsFixedArray() || obj->IsCode()) {
- Page* p = Page::FromAddress(obj->address());
- if (p->size() > static_cast<size_t>(Page::kPageSize)) {
- p->SetFlag(Page::RESCAN_ON_EVACUATION);
- }
- }
- }
- }
// Mark strong roots grey.
IncrementalMarkingRootMarkingVisitor visitor(heap_, this);
=======================================
--- /branches/bleeding_edge/src/incremental-marking.h Tue Sep 20 04:20:00
2011
+++ /branches/bleeding_edge/src/incremental-marking.h Wed Sep 28 10:45:58
2011
@@ -172,7 +172,7 @@
}
inline void SetOldSpacePageFlags(MemoryChunk* chunk) {
- SetOldSpacePageFlags(chunk, IsMarking());
+ SetOldSpacePageFlags(chunk, IsMarking(), IsCompacting());
}
inline void SetNewSpacePageFlags(NewSpacePage* chunk) {
@@ -208,7 +208,7 @@
void StartMarking();
- static void ActivateIncrementalWriteBarrier(PagedSpace* space);
+ void ActivateIncrementalWriteBarrier(PagedSpace* space);
static void ActivateIncrementalWriteBarrier(NewSpace* space);
void ActivateIncrementalWriteBarrier();
@@ -216,7 +216,10 @@
static void DeactivateIncrementalWriteBarrierForSpace(NewSpace* space);
void DeactivateIncrementalWriteBarrier();
- static void SetOldSpacePageFlags(MemoryChunk* chunk, bool is_marking);
+ static void SetOldSpacePageFlags(MemoryChunk* chunk,
+ bool is_marking,
+ bool is_compacting);
+
static void SetNewSpacePageFlags(NewSpacePage* chunk, bool is_marking);
void EnsureMarkingDequeIsCommitted();
=======================================
--- /branches/bleeding_edge/src/mark-compact.cc Wed Sep 28 03:45:27 2011
+++ /branches/bleeding_edge/src/mark-compact.cc Wed Sep 28 10:45:58 2011
@@ -840,6 +840,12 @@
MarkBit mark = Marking::MarkBitFrom(cell);
heap->mark_compact_collector()->MarkObject(cell, mark);
}
+
+ static inline void VisitEmbeddedPointer(Heap* heap, Code* host, Object**
p) {
+ MarkObjectByPointer(heap->mark_compact_collector(),
+ reinterpret_cast<Object**>(host),
+ p);
+ }
static inline void VisitCodeTarget(Heap* heap, RelocInfo* rinfo) {
ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
@@ -2440,6 +2446,10 @@
void VisitPointers(Object** start, Object** end) {
for (Object** p = start; p < end; p++) UpdatePointer(p);
}
+
+ void VisitEmbeddedPointer(Code* host, Object** p) {
+ UpdatePointer(p);
+ }
void VisitCodeTarget(RelocInfo* rinfo) {
ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
=======================================
--- /branches/bleeding_edge/src/mips/assembler-mips-inl.h Tue Sep 13
05:12:25 2011
+++ /branches/bleeding_edge/src/mips/assembler-mips-inl.h Wed Sep 28
10:45:58 2011
@@ -244,7 +244,7 @@
if (mode == RelocInfo::EMBEDDED_OBJECT) {
Object** p = target_object_address();
Object* orig = *p;
- visitor->VisitPointer(p);
+ visitor->VisitEmbeddedPointer(host(), p);
if (*p != orig) {
set_target_object(*p);
}
@@ -273,7 +273,7 @@
void RelocInfo::Visit(Heap* heap) {
RelocInfo::Mode mode = rmode();
if (mode == RelocInfo::EMBEDDED_OBJECT) {
- StaticVisitor::VisitPointer(heap, target_object_address());
+ StaticVisitor::VisitEmbeddedPointer(heap, host(),
target_object_address());
} else if (RelocInfo::IsCodeTarget(mode)) {
StaticVisitor::VisitCodeTarget(heap, this);
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
=======================================
--- /branches/bleeding_edge/src/objects.h Wed Sep 28 05:23:40 2011
+++ /branches/bleeding_edge/src/objects.h Wed Sep 28 10:45:58 2011
@@ -7501,6 +7501,13 @@
// Handy shorthand for visiting a single pointer.
virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); }
+
+ // Visit pointer embedded into a code object.
+ virtual void VisitEmbeddedPointer(Code* host, Object** p) {
+ // Default implementation for the convenience of users that do
+ // not care about the host object.
+ VisitPointer(p);
+ }
// Visits a contiguous arrays of external references (references to the
C++
// heap) in the half-open range [start, end). Any or all of the values
=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64-inl.h Mon Sep 19 11:36:47
2011
+++ /branches/bleeding_edge/src/x64/assembler-x64-inl.h Wed Sep 28 10:45:58
2011
@@ -388,7 +388,7 @@
void RelocInfo::Visit(ObjectVisitor* visitor) {
RelocInfo::Mode mode = rmode();
if (mode == RelocInfo::EMBEDDED_OBJECT) {
- visitor->VisitPointer(target_object_address());
+ visitor->VisitEmbeddedPointer(host(), target_object_address());
CPU::FlushICache(pc_, sizeof(Address));
} else if (RelocInfo::IsCodeTarget(mode)) {
visitor->VisitCodeTarget(this);
@@ -416,7 +416,7 @@
void RelocInfo::Visit(Heap* heap) {
RelocInfo::Mode mode = rmode();
if (mode == RelocInfo::EMBEDDED_OBJECT) {
- StaticVisitor::VisitPointer(heap, target_object_address());
+ StaticVisitor::VisitEmbeddedPointer(heap, host(),
target_object_address());
CPU::FlushICache(pc_, sizeof(Address));
} else if (RelocInfo::IsCodeTarget(mode)) {
StaticVisitor::VisitCodeTarget(heap, this);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev