Commit 4ac11e3b authored by whesse@chromium.org's avatar whesse@chromium.org

Don't convert jump and call targets to code object pointers when (de)serializing.

Review URL: http://codereview.chromium.org/207012

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2932 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 425cd77c
...@@ -935,6 +935,19 @@ class ReferenceUpdater: public ObjectVisitor { ...@@ -935,6 +935,19 @@ class ReferenceUpdater: public ObjectVisitor {
} }
} }
// 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) { virtual void VisitExternalReferences(Address* start, Address* end) {
for (Address* p = start; p < end; ++p) { for (Address* p = start; p < end; ++p) {
uint32_t code = reference_encoder_->Encode(*p); uint32_t code = reference_encoder_->Encode(*p);
...@@ -1093,6 +1106,14 @@ void Serializer::VisitPointers(Object** start, Object** end) { ...@@ -1093,6 +1106,14 @@ void Serializer::VisitPointers(Object** start, Object** end) {
} }
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 { class GlobalHandlesRetriever: public ObjectVisitor {
public: public:
explicit GlobalHandlesRetriever(List<Object**>* handles) explicit GlobalHandlesRetriever(List<Object**>* handles)
...@@ -1255,10 +1276,7 @@ Address Serializer::PutObject(HeapObject* obj) { ...@@ -1255,10 +1276,7 @@ Address Serializer::PutObject(HeapObject* obj) {
SaveAddress(obj, addr); SaveAddress(obj, addr);
if (type == CODE_TYPE) { if (type == CODE_TYPE) {
Code* code = Code::cast(obj); LOG(CodeMoveEvent(obj->address(), addr));
// Ensure Code objects contain Object pointers, not Addresses.
code->ConvertICTargetsFromAddressToObject();
LOG(CodeMoveEvent(code->address(), addr));
} }
// Write out the object prologue: type, size, and simulated address of obj. // Write out the object prologue: type, size, and simulated address of obj.
...@@ -1290,12 +1308,6 @@ Address Serializer::PutObject(HeapObject* obj) { ...@@ -1290,12 +1308,6 @@ Address Serializer::PutObject(HeapObject* obj) {
} }
#endif #endif
if (type == CODE_TYPE) {
Code* code = Code::cast(obj);
// Convert relocations from Object* to Address in Code objects
code->ConvertICTargetsFromObjectToAddress();
}
objects_++; objects_++;
return addr; return addr;
} }
...@@ -1422,6 +1434,14 @@ void Deserializer::VisitPointers(Object** start, Object** end) { ...@@ -1422,6 +1434,14 @@ void Deserializer::VisitPointers(Object** start, Object** end) {
} }
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) { void Deserializer::VisitExternalReferences(Address* start, Address* end) {
for (Address* p = start; p < end; ++p) { for (Address* p = start; p < end; ++p) {
uint32_t code = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(*p)); uint32_t code = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(*p));
...@@ -1617,8 +1637,6 @@ Object* Deserializer::GetObject() { ...@@ -1617,8 +1637,6 @@ Object* Deserializer::GetObject() {
if (type == CODE_TYPE) { if (type == CODE_TYPE) {
Code* code = Code::cast(obj); Code* code = Code::cast(obj);
// Convert relocations from Object* to Address in Code objects
code->ConvertICTargetsFromObjectToAddress();
LOG(CodeMoveEvent(a, code->address())); LOG(CodeMoveEvent(a, code->address()));
} }
objects_++; objects_++;
......
...@@ -154,8 +154,9 @@ class Serializer: public ObjectVisitor { ...@@ -154,8 +154,9 @@ class Serializer: public ObjectVisitor {
private: private:
friend class ReferenceUpdater; friend class ReferenceUpdater;
virtual void BeginCodeIteration(Code* code) { }
virtual void VisitPointers(Object** start, Object** end); virtual void VisitPointers(Object** start, Object** end);
virtual void VisitCodeTarget(RelocInfo* rinfo);
bool IsVisited(HeapObject* obj); bool IsVisited(HeapObject* obj);
Address GetSavedAddress(HeapObject* obj); Address GetSavedAddress(HeapObject* obj);
...@@ -289,6 +290,8 @@ class Deserializer: public ObjectVisitor { ...@@ -289,6 +290,8 @@ class Deserializer: public ObjectVisitor {
private: private:
virtual void VisitPointers(Object** start, Object** end); 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 VisitExternalReferences(Address* start, Address* end);
virtual void VisitRuntimeEntry(RelocInfo* rinfo); virtual void VisitRuntimeEntry(RelocInfo* rinfo);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment