| Index: src/mips/assembler-mips-inl.h
|
| diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h
|
| index f9e75face8a69c0670218890db6357d4748a8360..abfea6710789023d45ebd738af098d20f891daa5 100644
|
| --- a/src/mips/assembler-mips-inl.h
|
| +++ b/src/mips/assembler-mips-inl.h
|
| @@ -117,8 +117,26 @@ Address RelocInfo::target_address() {
|
|
|
|
|
| Address RelocInfo::target_address_address() {
|
| - ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
|
| - return reinterpret_cast<Address>(pc_);
|
| + ASSERT(IsCodeTarget(rmode_) ||
|
| + rmode_ == RUNTIME_ENTRY ||
|
| + rmode_ == EMBEDDED_OBJECT ||
|
| + rmode_ == EXTERNAL_REFERENCE);
|
| + // Read the address of the word containing the target_address in an
|
| + // instruction stream.
|
| + // The only architecture-independent user of this function is the serializer.
|
| + // The serializer uses it to find out how many raw bytes of instruction to
|
| + // output before the next target.
|
| + // For an instruction like LUI/ORI where the target bits are mixed into the
|
| + // instruction bits, the size of the target will be zero, indicating that the
|
| + // serializer should not step forward in memory after a target is resolved
|
| + // and written. In this case the target_address_address function should
|
| + // return the end of the instructions to be patched, allowing the
|
| + // deserializer to deserialize the instructions as raw bytes and put them in
|
| + // place, ready to be patched with the target. After jump optimization,
|
| + // that is the address of the instruction that follows J/JAL/JR/JALR
|
| + // instruction.
|
| + return reinterpret_cast<Address>(
|
| + pc_ + Assembler::kInstructionsFor32BitConstant * Assembler::kInstrSize);
|
| }
|
|
|
|
|
| @@ -281,7 +299,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) &&
|
| @@ -307,7 +325,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) &&
|
|
|