Revision: 2932
Author: [email protected]
Date: Fri Sep 18 03:50:08 2009
Log: Don't convert jump and call targets to code object pointers when
(de)serializing.
Review URL: http://codereview.chromium.org/207012
http://code.google.com/p/v8/source/detail?r=2932
Modified:
/branches/bleeding_edge/src/serialize.cc
/branches/bleeding_edge/src/serialize.h
=======================================
--- /branches/bleeding_edge/src/serialize.cc Wed Sep 9 02:35:34 2009
+++ /branches/bleeding_edge/src/serialize.cc Fri Sep 18 03:50:08 2009
@@ -934,6 +934,19 @@
}
}
}
+
+ // Do not assert that code targets have been converted to object
pointers.
+ virtual void BeginCodeIteration(Code* code) {
+ }
+
+ virtual void VisitCodeTarget(RelocInfo* rinfo) {
+ ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
+ Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
+ Address encoded_target = serializer_->GetSavedAddress(target);
+ offsets_.Add(rinfo->target_address_address() - obj_address_);
+ addresses_.Add(encoded_target);
+ }
+
virtual void VisitExternalReferences(Address* start, Address* end) {
for (Address* p = start; p < end; ++p) {
@@ -1091,6 +1104,14 @@
}
root_ = root;
}
+
+
+void Serializer::VisitCodeTarget(RelocInfo* rinfo) {
+ ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
+ Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
+ bool serialized;
+ Encode(target, &serialized);
+}
class GlobalHandlesRetriever: public ObjectVisitor {
@@ -1255,10 +1276,7 @@
SaveAddress(obj, addr);
if (type == CODE_TYPE) {
- Code* code = Code::cast(obj);
- // Ensure Code objects contain Object pointers, not Addresses.
- code->ConvertICTargetsFromAddressToObject();
- LOG(CodeMoveEvent(code->address(), addr));
+ LOG(CodeMoveEvent(obj->address(), addr));
}
// Write out the object prologue: type, size, and simulated address of
obj.
@@ -1290,12 +1308,6 @@
}
#endif
- if (type == CODE_TYPE) {
- Code* code = Code::cast(obj);
- // Convert relocations from Object* to Address in Code objects
- code->ConvertICTargetsFromObjectToAddress();
- }
-
objects_++;
return addr;
}
@@ -1420,6 +1432,14 @@
}
root_ = root;
}
+
+
+void Deserializer::VisitCodeTarget(RelocInfo* rinfo) {
+ ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
+ Address encoded_address =
reinterpret_cast<Address>(rinfo->target_object());
+ Code* target_object = reinterpret_cast<Code*>(Resolve(encoded_address));
+ rinfo->set_target_address(target_object->instruction_start());
+}
void Deserializer::VisitExternalReferences(Address* start, Address* end) {
@@ -1617,8 +1637,6 @@
if (type == CODE_TYPE) {
Code* code = Code::cast(obj);
- // Convert relocations from Object* to Address in Code objects
- code->ConvertICTargetsFromObjectToAddress();
LOG(CodeMoveEvent(a, code->address()));
}
objects_++;
=======================================
--- /branches/bleeding_edge/src/serialize.h Wed Sep 9 02:35:34 2009
+++ /branches/bleeding_edge/src/serialize.h Fri Sep 18 03:50:08 2009
@@ -154,8 +154,9 @@
private:
friend class ReferenceUpdater;
+ virtual void BeginCodeIteration(Code* code) { }
virtual void VisitPointers(Object** start, Object** end);
-
+ virtual void VisitCodeTarget(RelocInfo* rinfo);
bool IsVisited(HeapObject* obj);
Address GetSavedAddress(HeapObject* obj);
@@ -289,6 +290,8 @@
private:
virtual void VisitPointers(Object** start, Object** end);
+ virtual void BeginCodeIteration(Code* code) { }
+ virtual void VisitCodeTarget(RelocInfo* rinfo);
virtual void VisitExternalReferences(Address* start, Address* end);
virtual void VisitRuntimeEntry(RelocInfo* rinfo);
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---