Reviewers: Michael Starzinger, Vyacheslav Egorov, danno, Paul Lind,
Message:
Refactoring required for MIPS support in the serializer. See issue
http://codereview.chromium.org/8491008/ for the actual serializer patch.
Description:
Refactor embedded pointer visitors for the serializer
This patch continues the refactoring that started in r9597 and
extends it with support for the serializer.
This is required for MIPS support in the serializer.
BUG=
TEST=
Please review this at http://codereview.chromium.org/8467010/
Affected files:
M src/arm/assembler-arm-inl.h
M src/ia32/assembler-ia32-inl.h
M src/mark-compact.cc
M src/objects.h
M src/objects.cc
M src/serialize.h
M src/serialize.cc
M src/x64/assembler-x64-inl.h
Index: src/arm/assembler-arm-inl.h
diff --git a/src/arm/assembler-arm-inl.h b/src/arm/assembler-arm-inl.h
index
7f9f4cebe2b8becca6aab33c0ab1d54775526bd4..79f9c7bd2b3224cc3cf5696db874cd1d328c510c
100644
--- a/src/arm/assembler-arm-inl.h
+++ b/src/arm/assembler-arm-inl.h
@@ -64,7 +64,9 @@ Address RelocInfo::target_address() {
Address RelocInfo::target_address_address() {
- ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY
+ || rmode_ == EMBEDDED_OBJECT
+ || rmode_ == EXTERNAL_REFERENCE);
return
reinterpret_cast<Address>(Assembler::target_address_address_at(pc_));
}
@@ -224,7 +226,7 @@ void RelocInfo::Visit(ObjectVisitor* visitor) {
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
visitor->VisitGlobalPropertyCell(this);
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
- visitor->VisitExternalReference(target_reference_address());
+ visitor->VisitExternalReference(this);
#ifdef ENABLE_DEBUGGER_SUPPORT
// TODO(isolates): Get a cached isolate below.
} else if (((RelocInfo::IsJSReturn(mode) &&
@@ -250,7 +252,7 @@ void RelocInfo::Visit(Heap* heap) {
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
StaticVisitor::VisitGlobalPropertyCell(heap, this);
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
- StaticVisitor::VisitExternalReference(target_reference_address());
+ StaticVisitor::VisitExternalReference(this);
#ifdef ENABLE_DEBUGGER_SUPPORT
} else if (heap->isolate()->debug()->has_break_points() &&
((RelocInfo::IsJSReturn(mode) &&
Index: src/ia32/assembler-ia32-inl.h
diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h
index
2e9fcb6c54d2c23859d5593db994f668c0dce08e..5f67077ad014cfdf0d9824c1f4865558272018b2
100644
--- a/src/ia32/assembler-ia32-inl.h
+++ b/src/ia32/assembler-ia32-inl.h
@@ -78,7 +78,9 @@ Address RelocInfo::target_address() {
Address RelocInfo::target_address_address() {
- ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY
+ || rmode_ == EMBEDDED_OBJECT
+ || rmode_ == EXTERNAL_REFERENCE);
return reinterpret_cast<Address>(pc_);
}
@@ -224,7 +226,7 @@ void RelocInfo::Visit(ObjectVisitor* visitor) {
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
visitor->VisitGlobalPropertyCell(this);
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
- visitor->VisitExternalReference(target_reference_address());
+ visitor->VisitExternalReference(this);
CPU::FlushICache(pc_, sizeof(Address));
#ifdef ENABLE_DEBUGGER_SUPPORT
// TODO(isolates): Get a cached isolate below.
@@ -252,7 +254,7 @@ void RelocInfo::Visit(Heap* heap) {
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
StaticVisitor::VisitGlobalPropertyCell(heap, this);
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
- StaticVisitor::VisitExternalReference(target_reference_address());
+ StaticVisitor::VisitExternalReference(this);
CPU::FlushICache(pc_, sizeof(Address));
#ifdef ENABLE_DEBUGGER_SUPPORT
} else if (heap->isolate()->debug()->has_break_points() &&
Index: src/mark-compact.cc
diff --git a/src/mark-compact.cc b/src/mark-compact.cc
index
94e65fa3a3bdaf13681fca8a89ef1be6327561f7..315f2718c81207349c2d7f7017cde12e5c60f7cd
100644
--- a/src/mark-compact.cc
+++ b/src/mark-compact.cc
@@ -921,6 +921,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
}
static inline void VisitExternalReference(Address* p) { }
+ static inline void VisitExternalReference(RelocInfo* rinfo) { }
static inline void VisitRuntimeEntry(RelocInfo* rinfo) { }
private:
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
3a18184673eef0a52f5f25c4e285356678373152..8062b47d32d472805e8e26d98f5baee84f9422f3
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -7724,6 +7724,10 @@ void ObjectVisitor::VisitEmbeddedPointer(RelocInfo*
rinfo) {
VisitPointer(rinfo->target_object_address());
}
+void ObjectVisitor::VisitExternalReference(RelocInfo* rinfo) {
+ Address* p = rinfo->target_reference_address();
+ VisitExternalReferences(p, p+1);
+}
void Code::InvalidateRelocation() {
set_relocation_info(GetHeap()->empty_byte_array());
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
b423cd427994ec919f328da4b379fdf7b3a7c052..e71df5ad92af08c6a03f3e6c1161d1e460e7c761
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -7890,6 +7890,8 @@ class ObjectVisitor BASE_EMBEDDED {
// may be modified on return.
virtual void VisitExternalReferences(Address* start, Address* end) {}
+ virtual void VisitExternalReference(RelocInfo* rinfo);
+
inline void VisitExternalReference(Address* p) {
VisitExternalReferences(p, p + 1);
}
Index: src/serialize.cc
diff --git a/src/serialize.cc b/src/serialize.cc
index
ba7b2a5184825acd41a9b5e9f7619c8aac9aee7b..367cb44dcf6d21d8f22cf594ba7f05c702d2851d
100644
--- a/src/serialize.cc
+++ b/src/serialize.cc
@@ -1471,6 +1471,23 @@ void
Serializer::ObjectSerializer::VisitPointers(Object** start,
}
+void Serializer::ObjectSerializer::VisitEmbeddedPointer(RelocInfo* rinfo) {
+ Object** current = rinfo->target_object_address();
+
+ if(!(*current)->IsSmi()) {
+
OutputRawData(reinterpret_cast<Address>(rinfo->target_address_address()));
+ HowToCode representation;
+ if(rinfo->IsCodedSpecially()) {
+ representation = kFromCode;
+ } else {
+ representation = kPlain;
+ }
+ serializer_->SerializeObject(*current, representation, kStartOfObject);
+ bytes_processed_so_far_ += rinfo->target_address_size();
+ }
+}
+
+
void Serializer::ObjectSerializer::VisitExternalReferences(Address* start,
Address* end) {
Address references_start = reinterpret_cast<Address>(start);
@@ -1485,6 +1502,25 @@ void
Serializer::ObjectSerializer::VisitExternalReferences(Address* start,
}
+void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo*
rinfo) {
+ Address references_start =
+ reinterpret_cast<Address>(rinfo->target_address_address());
+ OutputRawData(references_start);
+ Address* current =
+ reinterpret_cast<Address*>(rinfo->target_reference_address());
+ int representation;
+ if(rinfo->IsCodedSpecially()) {
+ representation = kFromCode + kStartOfObject;
+ } else {
+ representation = kPlain + kStartOfObject;
+ }
+ sink_->Put(kExternalReference + representation, "ExternalRef");
+ int reference_id = serializer_->EncodeExternalReference(*current);
+ sink_->PutInt(reference_id, "reference id");
+ bytes_processed_so_far_ += rinfo->target_address_size();
+}
+
+
void Serializer::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) {
Address target_start = rinfo->target_address_address();
OutputRawData(target_start);
Index: src/serialize.h
diff --git a/src/serialize.h b/src/serialize.h
index
b598c6ce3fc9fa6263860fd275f2b53288267e43..ff10905b9ad849b308493e436e2a36258776dc5c
100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -514,7 +514,9 @@ class Serializer : public SerializerDeserializer {
bytes_processed_so_far_(0) { }
void Serialize();
void VisitPointers(Object** start, Object** end);
+ void VisitEmbeddedPointer(RelocInfo* target);
void VisitExternalReferences(Address* start, Address* end);
+ void VisitExternalReference(RelocInfo* rinfo);
void VisitCodeTarget(RelocInfo* target);
void VisitCodeEntry(Address entry_address);
void VisitGlobalPropertyCell(RelocInfo* rinfo);
Index: src/x64/assembler-x64-inl.h
diff --git a/src/x64/assembler-x64-inl.h b/src/x64/assembler-x64-inl.h
index
f7b87ec041b079f18d947bb816179b82e4ea018d..ab387d6d0a00c6e326e618b60bdacd97ad947e86
100644
--- a/src/x64/assembler-x64-inl.h
+++ b/src/x64/assembler-x64-inl.h
@@ -224,7 +224,9 @@ Address RelocInfo::target_address() {
Address RelocInfo::target_address_address() {
- ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY
+ || rmode_ == EMBEDDED_OBJECT
+ || rmode_ == EXTERNAL_REFERENCE);
return reinterpret_cast<Address>(pc_);
}
@@ -399,7 +401,7 @@ void RelocInfo::Visit(ObjectVisitor* visitor) {
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
visitor->VisitGlobalPropertyCell(this);
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
- visitor->VisitExternalReference(target_reference_address());
+ visitor->VisitExternalReference(this);
CPU::FlushICache(pc_, sizeof(Address));
#ifdef ENABLE_DEBUGGER_SUPPORT
// TODO(isolates): Get a cached isolate below.
@@ -427,7 +429,7 @@ void RelocInfo::Visit(Heap* heap) {
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
StaticVisitor::VisitGlobalPropertyCell(heap, this);
} else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
- StaticVisitor::VisitExternalReference(target_reference_address());
+ StaticVisitor::VisitExternalReference(this);
CPU::FlushICache(pc_, sizeof(Address));
#ifdef ENABLE_DEBUGGER_SUPPORT
} else if (heap->isolate()->debug()->has_break_points() &&
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev