Revision: 9853
Author: [email protected]
Date: Mon Oct 31 13:59:28 2011
Log: Split incremental marking write barrier into fast and slow paths.
Force inlining of the fast path.
Force inlining LiteralBuffer::AddChar and Scanner::AddLiteralChar.
[email protected]
Review URL: http://codereview.chromium.org/8431010
http://code.google.com/p/v8/source/detail?r=9853
Modified:
/branches/bleeding_edge/src/incremental-marking-inl.h
/branches/bleeding_edge/src/incremental-marking.cc
/branches/bleeding_edge/src/incremental-marking.h
/branches/bleeding_edge/src/scanner.h
=======================================
--- /branches/bleeding_edge/src/incremental-marking-inl.h Thu Oct 13
04:50:00 2011
+++ /branches/bleeding_edge/src/incremental-marking-inl.h Mon Oct 31
13:59:28 2011
@@ -37,62 +37,42 @@
bool IncrementalMarking::BaseRecordWrite(HeapObject* obj,
Object** slot,
Object* value) {
- if (IsMarking() && value->IsHeapObject()) {
- MarkBit value_bit = Marking::MarkBitFrom(HeapObject::cast(value));
- if (Marking::IsWhite(value_bit)) {
- MarkBit obj_bit = Marking::MarkBitFrom(obj);
- if (Marking::IsBlack(obj_bit)) {
- BlackToGreyAndUnshift(obj, obj_bit);
- RestartIfNotMarking();
- }
-
- // Object is either grey or white it will be scanned if survives.
- return false;
- }
- return true;
- }
- return false;
+ MarkBit value_bit = Marking::MarkBitFrom(HeapObject::cast(value));
+ if (Marking::IsWhite(value_bit)) {
+ MarkBit obj_bit = Marking::MarkBitFrom(obj);
+ if (Marking::IsBlack(obj_bit)) {
+ BlackToGreyAndUnshift(obj, obj_bit);
+ RestartIfNotMarking();
+ }
+
+ // Object is either grey or white. It will be scanned if survives.
+ return false;
+ }
+ return true;
}
void IncrementalMarking::RecordWrite(HeapObject* obj,
Object** slot,
Object* value) {
- if (BaseRecordWrite(obj, slot, value) && is_compacting_ && slot != NULL)
{
- MarkBit obj_bit = Marking::MarkBitFrom(obj);
- if (Marking::IsBlack(obj_bit)) {
- // Object is not going to be rescanned we need to record the slot.
- heap_->mark_compact_collector()->RecordSlot(
- HeapObject::RawField(obj, 0), slot, value);
- }
+ if (IsMarking() && value->NonFailureIsHeapObject()) {
+ RecordWriteSlow(obj, slot, value);
}
}
+
+
+void IncrementalMarking::RecordWriteOfCodeEntry(JSFunction* host,
+ Object** slot,
+ Code* value) {
+ if (IsMarking()) RecordWriteOfCodeEntrySlow(host, slot, value);
+}
void IncrementalMarking::RecordWriteIntoCode(HeapObject* obj,
RelocInfo* rinfo,
Object* value) {
- if (IsMarking() && value->IsHeapObject()) {
- MarkBit value_bit = Marking::MarkBitFrom(HeapObject::cast(value));
- if (Marking::IsWhite(value_bit)) {
- MarkBit obj_bit = Marking::MarkBitFrom(obj);
- if (Marking::IsBlack(obj_bit)) {
- BlackToGreyAndUnshift(obj, obj_bit);
- RestartIfNotMarking();
- }
-
- // Object is either grey or white it will be scanned if survives.
- return;
- }
-
- if (is_compacting_) {
- MarkBit obj_bit = Marking::MarkBitFrom(obj);
- if (Marking::IsBlack(obj_bit)) {
- // Object is not going to be rescanned we need to record the slot.
- heap_->mark_compact_collector()->RecordRelocSlot(rinfo,
-
Code::cast(value));
- }
- }
+ if (IsMarking() && value->NonFailureIsHeapObject()) {
+ RecordWriteIntoCodeSlow(obj, rinfo, value);
}
}
=======================================
--- /branches/bleeding_edge/src/incremental-marking.cc Tue Oct 25 06:27:46
2011
+++ /branches/bleeding_edge/src/incremental-marking.cc Mon Oct 31 13:59:28
2011
@@ -58,6 +58,20 @@
void IncrementalMarking::TearDown() {
delete marking_deque_memory_;
}
+
+
+void IncrementalMarking::RecordWriteSlow(HeapObject* obj,
+ Object** slot,
+ Object* value) {
+ if (BaseRecordWrite(obj, slot, value) && is_compacting_ && slot != NULL)
{
+ MarkBit obj_bit = Marking::MarkBitFrom(obj);
+ if (Marking::IsBlack(obj_bit)) {
+ // Object is not going to be rescanned we need to record the slot.
+ heap_->mark_compact_collector()->RecordSlot(
+ HeapObject::RawField(obj, 0), slot, value);
+ }
+ }
+}
void IncrementalMarking::RecordWriteFromCode(HeapObject* obj,
@@ -108,7 +122,7 @@
}
-void IncrementalMarking::RecordWriteOfCodeEntry(JSFunction* host,
+void IncrementalMarking::RecordWriteOfCodeEntrySlow(JSFunction* host,
Object** slot,
Code* value) {
if (BaseRecordWrite(host, slot, value) && is_compacting_) {
@@ -118,6 +132,30 @@
}
}
+
+void IncrementalMarking::RecordWriteIntoCodeSlow(HeapObject* obj,
+ RelocInfo* rinfo,
+ Object* value) {
+ MarkBit value_bit = Marking::MarkBitFrom(HeapObject::cast(value));
+ if (Marking::IsWhite(value_bit)) {
+ MarkBit obj_bit = Marking::MarkBitFrom(obj);
+ if (Marking::IsBlack(obj_bit)) {
+ BlackToGreyAndUnshift(obj, obj_bit);
+ RestartIfNotMarking();
+ }
+ // Object is either grey or white. It will be scanned if survives.
+ return;
+ }
+
+ if (is_compacting_) {
+ MarkBit obj_bit = Marking::MarkBitFrom(obj);
+ if (Marking::IsBlack(obj_bit)) {
+ // Object is not going to be rescanned. We need to record the slot.
+ heap_->mark_compact_collector()->RecordRelocSlot(rinfo,
+ Code::cast(value));
+ }
+ }
+}
class IncrementalMarkingMarkingVisitor : public ObjectVisitor {
=======================================
--- /branches/bleeding_edge/src/incremental-marking.h Fri Oct 21 03:32:38
2011
+++ /branches/bleeding_edge/src/incremental-marking.h Mon Oct 31 13:59:28
2011
@@ -59,7 +59,7 @@
inline bool IsStopped() { return state() == STOPPED; }
- inline bool IsMarking() { return state() >= MARKING; }
+ INLINE(bool IsMarking()) { return state() >= MARKING; }
inline bool IsMarkingIncomplete() { return state() == MARKING; }
@@ -120,16 +120,23 @@
Object** slot,
Isolate* isolate);
- inline bool BaseRecordWrite(HeapObject* obj, Object** slot, Object*
value);
+ INLINE(bool BaseRecordWrite(HeapObject* obj, Object** slot, Object*
value));
+ INLINE(void RecordWrite(HeapObject* obj, Object** slot, Object* value));
+ INLINE(void RecordWriteIntoCode(HeapObject* obj,
+ RelocInfo* rinfo,
+ Object* value));
+ INLINE(void RecordWriteOfCodeEntry(JSFunction* host,
+ Object** slot,
+ Code* value));
- inline void RecordWrite(HeapObject* obj, Object** slot, Object* value);
- inline void RecordWriteIntoCode(HeapObject* obj,
- RelocInfo* rinfo,
- Object* value);
+ void RecordWriteSlow(HeapObject* obj, Object** slot, Object* value);
+ void RecordWriteIntoCodeSlow(HeapObject* obj,
+ RelocInfo* rinfo,
+ Object* value);
+ void RecordWriteOfCodeEntrySlow(JSFunction* host, Object** slot, Code*
value);
void RecordCodeTargetPatch(Code* host, Address pc, HeapObject* value);
void RecordCodeTargetPatch(Address pc, HeapObject* value);
- void RecordWriteOfCodeEntry(JSFunction* host, Object** slot, Code*
value);
inline void RecordWrites(HeapObject* obj);
=======================================
--- /branches/bleeding_edge/src/scanner.h Mon Oct 17 05:45:52 2011
+++ /branches/bleeding_edge/src/scanner.h Mon Oct 31 13:59:28 2011
@@ -169,7 +169,7 @@
}
}
- inline void AddChar(uc16 character) {
+ INLINE(void AddChar(uc16 character)) {
if (position_ >= backing_store_.length()) ExpandBuffer();
if (is_ascii_) {
if (character < kMaxAsciiCharCodeU) {
@@ -389,7 +389,7 @@
next_.literal_chars = free_buffer;
}
- inline void AddLiteralChar(uc32 c) {
+ INLINE(void AddLiteralChar(uc32 c)) {
ASSERT_NOT_NULL(next_.literal_chars);
next_.literal_chars->AddChar(c);
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev