diff options
Diffstat (limited to 'deps/v8/src/mips/assembler-mips-inl.h')
-rw-r--r-- | deps/v8/src/mips/assembler-mips-inl.h | 87 |
1 files changed, 77 insertions, 10 deletions
diff --git a/deps/v8/src/mips/assembler-mips-inl.h b/deps/v8/src/mips/assembler-mips-inl.h index 1fdb3e97e5..7b6b3f8c76 100644 --- a/deps/v8/src/mips/assembler-mips-inl.h +++ b/deps/v8/src/mips/assembler-mips-inl.h @@ -200,6 +200,39 @@ Address Assembler::break_address_from_return_address(Address pc) { } +void Assembler::set_target_internal_reference_encoded_at(Address pc, + Address target) { + // Encoded internal references are lui/ori load of 32-bit abolute address. + Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); + Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); + DCHECK(Assembler::IsLui(instr_lui)); + DCHECK(Assembler::IsOri(instr_ori)); + instr_lui &= ~kImm16Mask; + instr_ori &= ~kImm16Mask; + int32_t imm = reinterpret_cast<int32_t>(target); + DCHECK((imm & 3) == 0); + Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, + instr_lui | ((imm >> kLuiShift) & kImm16Mask)); + Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, + instr_ori | (imm & kImm16Mask)); + + // Currently used only by deserializer, and all code will be flushed + // after complete deserialization, no need to flush on each reference. +} + + +void Assembler::deserialization_set_target_internal_reference_at( + Address pc, Address target, RelocInfo::Mode mode) { + if (mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { + DCHECK(IsLui(instr_at(pc))); + set_target_internal_reference_encoded_at(pc, target); + } else { + DCHECK(mode == RelocInfo::INTERNAL_REFERENCE); + Memory::Address_at(pc) = target; + } +} + + Object* RelocInfo::target_object() { DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); @@ -229,12 +262,35 @@ void RelocInfo::set_target_object(Object* target, } -Address RelocInfo::target_reference() { +Address RelocInfo::target_external_reference() { DCHECK(rmode_ == EXTERNAL_REFERENCE); return Assembler::target_address_at(pc_, host_); } +Address RelocInfo::target_internal_reference() { + if (rmode_ == INTERNAL_REFERENCE) { + return Memory::Address_at(pc_); + } else { + // Encoded internal references are lui/ori load of 32-bit abolute address. + DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); + Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); + Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); + DCHECK(Assembler::IsLui(instr_lui)); + DCHECK(Assembler::IsOri(instr_ori)); + int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift; + imm |= (instr_ori & static_cast<int32_t>(kImm16Mask)); + return reinterpret_cast<Address>(imm); + } +} + + +Address RelocInfo::target_internal_reference_address() { + DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); + return reinterpret_cast<Address>(pc_); +} + + Address RelocInfo::target_runtime_entry(Assembler* origin) { DCHECK(IsRuntimeEntry(rmode_)); return target_address(); @@ -307,8 +363,8 @@ Address RelocInfo::call_address() { DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); // The pc_ offset of 0 assumes mips patched return sequence per - // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or - // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). + // debug-mips.cc BreakLocation::SetDebugBreakAtReturn(), or + // debug break slot per BreakLocation::SetDebugBreakAtSlot(). return Assembler::target_address_at(pc_, host_); } @@ -317,8 +373,8 @@ void RelocInfo::set_call_address(Address target) { DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); // The pc_ offset of 0 assumes mips patched return sequence per - // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or - // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). + // debug-mips.cc BreakLocation::SetDebugBreakAtReturn(), or + // debug break slot per BreakLocation::SetDebugBreakAtSlot(). Assembler::set_target_address_at(pc_, host_, target); if (host() != NULL) { Object* target_code = Code::GetCodeFromTargetAddress(target); @@ -346,11 +402,16 @@ void RelocInfo::set_call_object(Object* target) { void RelocInfo::WipeOut() { - DCHECK(IsEmbeddedObject(rmode_) || - IsCodeTarget(rmode_) || - IsRuntimeEntry(rmode_) || - IsExternalReference(rmode_)); - Assembler::set_target_address_at(pc_, host_, NULL); + DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || + IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || + IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); + if (IsInternalReference(rmode_)) { + Memory::Address_at(pc_) = NULL; + } else if (IsInternalReferenceEncoded(rmode_)) { + Assembler::set_target_internal_reference_encoded_at(pc_, nullptr); + } else { + Assembler::set_target_address_at(pc_, host_, NULL); + } } @@ -383,6 +444,9 @@ void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { visitor->VisitCell(this); } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { visitor->VisitExternalReference(this); + } else if (mode == RelocInfo::INTERNAL_REFERENCE || + mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { + visitor->VisitInternalReference(this); } else if (RelocInfo::IsCodeAgeSequence(mode)) { visitor->VisitCodeAgeSequence(this); } else if (((RelocInfo::IsJSReturn(mode) && @@ -408,6 +472,9 @@ void RelocInfo::Visit(Heap* heap) { StaticVisitor::VisitCell(heap, this); } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { StaticVisitor::VisitExternalReference(this); + } else if (mode == RelocInfo::INTERNAL_REFERENCE || + mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { + StaticVisitor::VisitInternalReference(this); } else if (RelocInfo::IsCodeAgeSequence(mode)) { StaticVisitor::VisitCodeAgeSequence(heap, this); } else if (heap->isolate()->debug()->has_break_points() && |