| Index: src/serialize.cc
|
| ===================================================================
|
| --- src/serialize.cc (revision 11074)
|
| +++ src/serialize.cc (working copy)
|
| @@ -849,13 +849,12 @@
|
| if (how == kFromCode) { \
|
| Address location_of_branch_data = \
|
| reinterpret_cast<Address>(current); \
|
| - Assembler::set_target_at(location_of_branch_data, \
|
| - reinterpret_cast<Address>(new_object)); \
|
| - if (within == kFirstInstruction) { \
|
| - location_of_branch_data += Assembler::kCallTargetSize; \
|
| - current = reinterpret_cast<Object**>(location_of_branch_data); \
|
| - current_was_incremented = true; \
|
| - } \
|
| + Assembler::deserialization_set_special_target_at( \
|
| + location_of_branch_data, \
|
| + reinterpret_cast<Address>(new_object)); \
|
| + location_of_branch_data += Assembler::kSpecialTargetSize; \
|
| + current = reinterpret_cast<Object**>(location_of_branch_data); \
|
| + current_was_incremented = true; \
|
| } else { \
|
| *current = new_object; \
|
| } \
|
| @@ -991,7 +990,22 @@
|
| // Find a recently deserialized object using its offset from the current
|
| // allocation point and write a pointer to it to the current object.
|
| ALL_SPACES(kBackref, kPlain, kStartOfObject)
|
| +#if V8_TARGET_ARCH_MIPS
|
| + // Deserialize a new object from pointer found in code and write
|
| + // a pointer to it to the current object. Required only for MIPS, and
|
| + // omitted on the other architectures because it is fully unrolled and
|
| + // would cause bloat.
|
| + ONE_PER_SPACE(kNewObject, kFromCode, kStartOfObject)
|
| // Find a recently deserialized code object using its offset from the
|
| + // current allocation point and write a pointer to it to the current
|
| + // object. Required only for MIPS.
|
| + ALL_SPACES(kBackref, kFromCode, kStartOfObject)
|
| + // Find an already deserialized code object using its offset from
|
| + // the start and write a pointer to it to the current object.
|
| + // Required only for MIPS.
|
| + ALL_SPACES(kFromStart, kFromCode, kStartOfObject)
|
| +#endif
|
| + // Find a recently deserialized code object using its offset from the
|
| // current allocation point and write a pointer to its first instruction
|
| // to the current code object or the instruction pointer in a function
|
| // object.
|
| @@ -1229,12 +1243,23 @@
|
| }
|
|
|
|
|
| -int Serializer::RootIndex(HeapObject* heap_object) {
|
| +int Serializer::RootIndex(HeapObject* heap_object, HowToCode from) {
|
| Heap* heap = HEAP;
|
| if (heap->InNewSpace(heap_object)) return kInvalidRootIndex;
|
| for (int i = 0; i < root_index_wave_front_; i++) {
|
| Object* root = heap->roots_array_start()[i];
|
| - if (!root->IsSmi() && root == heap_object) return i;
|
| + if (!root->IsSmi() && root == heap_object) {
|
| +#if V8_TARGET_ARCH_MIPS
|
| + if (from == kFromCode) {
|
| + // In order to avoid code bloat in the deserializer we don't have
|
| + // support for the encoding that specifies a particular root should
|
| + // be written into the lui/ori instructions on MIPS. Therefore we
|
| + // should not generate such serialization data for MIPS.
|
| + return kInvalidRootIndex;
|
| + }
|
| +#endif
|
| + return i;
|
| + }
|
| }
|
| return kInvalidRootIndex;
|
| }
|
| @@ -1287,7 +1312,7 @@
|
| HeapObject* heap_object = HeapObject::cast(o);
|
|
|
| int root_index;
|
| - if ((root_index = RootIndex(heap_object)) != kInvalidRootIndex) {
|
| + if ((root_index = RootIndex(heap_object, how_to_code)) != kInvalidRootIndex) {
|
| PutRoot(root_index, heap_object, how_to_code, where_to_point);
|
| return;
|
| }
|
| @@ -1359,7 +1384,7 @@
|
| }
|
|
|
| int root_index;
|
| - if ((root_index = RootIndex(heap_object)) != kInvalidRootIndex) {
|
| + if ((root_index = RootIndex(heap_object, how_to_code)) != kInvalidRootIndex) {
|
| PutRoot(root_index, heap_object, how_to_code, where_to_point);
|
| return;
|
| }
|
| @@ -1439,7 +1464,7 @@
|
|
|
| while (current < end && !(*current)->IsSmi()) {
|
| HeapObject* current_contents = HeapObject::cast(*current);
|
| - int root_index = serializer_->RootIndex(current_contents);
|
| + int root_index = serializer_->RootIndex(current_contents, kPlain);
|
| // Repeats are not subject to the write barrier so there are only some
|
| // objects that can be used in a repeat encoding. These are the early
|
| // ones in the root array that are never in new space.
|
|
|