Revision: 9971
Author:   [email protected]
Date:     Fri Nov 11 04:28:42 2011
Log:      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.

Review URL: http://codereview.chromium.org/8467010
Patch from Gergely Kis <[email protected]>.
http://code.google.com/p/v8/source/detail?r=9971

Modified:
 /branches/bleeding_edge/src/arm/assembler-arm-inl.h
 /branches/bleeding_edge/src/ia32/assembler-ia32-inl.h
 /branches/bleeding_edge/src/mark-compact.cc
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/src/objects.h
 /branches/bleeding_edge/src/serialize.cc
 /branches/bleeding_edge/src/serialize.h
 /branches/bleeding_edge/src/x64/assembler-x64-inl.h

=======================================
--- /branches/bleeding_edge/src/arm/assembler-arm-inl.h Fri Oct 21 03:53:02 2011 +++ /branches/bleeding_edge/src/arm/assembler-arm-inl.h Fri Nov 11 04:28:42 2011
@@ -64,7 +64,9 @@


 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 @@
   } 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 @@
   } 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) &&
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32-inl.h Fri Oct 21 03:37:56 2011 +++ /branches/bleeding_edge/src/ia32/assembler-ia32-inl.h Fri Nov 11 04:28:42 2011
@@ -78,7 +78,9 @@


 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 @@
   } 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 @@
   } 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() &&
=======================================
--- /branches/bleeding_edge/src/mark-compact.cc Thu Nov 10 05:24:00 2011
+++ /branches/bleeding_edge/src/mark-compact.cc Fri Nov 11 04:28:42 2011
@@ -921,6 +921,7 @@
   }

   static inline void VisitExternalReference(Address* p) { }
+  static inline void VisitExternalReference(RelocInfo* rinfo) { }
   static inline void VisitRuntimeEntry(RelocInfo* rinfo) { }

  private:
=======================================
--- /branches/bleeding_edge/src/objects.cc      Wed Nov  9 04:15:35 2011
+++ /branches/bleeding_edge/src/objects.cc      Fri Nov 11 04:28:42 2011
@@ -7718,6 +7718,10 @@
   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());
=======================================
--- /branches/bleeding_edge/src/objects.h       Tue Nov  8 03:59:56 2011
+++ /branches/bleeding_edge/src/objects.h       Fri Nov 11 04:28:42 2011
@@ -7809,6 +7809,8 @@
   // heap) in the half-open range [start, end). Any or all of the values
   // 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);
=======================================
--- /branches/bleeding_edge/src/serialize.cc    Tue Oct 25 04:02:29 2011
+++ /branches/bleeding_edge/src/serialize.cc    Fri Nov 11 04:28:42 2011
@@ -1469,6 +1469,16 @@
     }
   }
 }
+
+
+void Serializer::ObjectSerializer::VisitEmbeddedPointer(RelocInfo* rinfo) {
+  Object** current = rinfo->target_object_address();
+
+  OutputRawData(rinfo->target_address_address());
+ HowToCode representation = rinfo->IsCodedSpecially() ? kFromCode : kPlain;
+  serializer_->SerializeObject(*current, representation, kStartOfObject);
+  bytes_processed_so_far_ += rinfo->target_address_size();
+}


 void Serializer::ObjectSerializer::VisitExternalReferences(Address* start,
@@ -1483,6 +1493,20 @@
   }
bytes_processed_so_far_ += static_cast<int>((end - start) * kPointerSize);
 }
+
+
+void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo* rinfo) {
+  Address references_start = rinfo->target_address_address();
+  OutputRawData(references_start);
+
+  Address* current = rinfo->target_reference_address();
+  int representation = rinfo->IsCodedSpecially() ?
+ kFromCode + kStartOfObject : 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) {
=======================================
--- /branches/bleeding_edge/src/serialize.h     Thu Nov  3 03:36:55 2011
+++ /branches/bleeding_edge/src/serialize.h     Fri Nov 11 04:28:42 2011
@@ -514,7 +514,9 @@
         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);
=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64-inl.h Fri Oct 21 03:53:02 2011 +++ /branches/bleeding_edge/src/x64/assembler-x64-inl.h Fri Nov 11 04:28:42 2011
@@ -224,7 +224,9 @@


 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 @@
   } 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 @@
   } 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

Reply via email to