diff options
Diffstat (limited to 'deps/v8/src/mips/assembler-mips-inl.h')
-rw-r--r-- | deps/v8/src/mips/assembler-mips-inl.h | 95 |
1 files changed, 54 insertions, 41 deletions
diff --git a/deps/v8/src/mips/assembler-mips-inl.h b/deps/v8/src/mips/assembler-mips-inl.h index a0ca03f3cf..5cdd8808a6 100644 --- a/deps/v8/src/mips/assembler-mips-inl.h +++ b/deps/v8/src/mips/assembler-mips-inl.h @@ -70,19 +70,20 @@ void RelocInfo::apply(intptr_t delta) { if (IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)) { // Absolute code pointer inside code object moves with the code object. Assembler::RelocateInternalReference(rmode_, pc_, delta); + } else if (IsRelativeCodeTarget(rmode_)) { + Assembler::RelocateRelativeReference(rmode_, pc_, delta); } } Address RelocInfo::target_address() { - DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_)); + DCHECK(IsCodeTargetMode(rmode_) || IsRuntimeEntry(rmode_) || + IsWasmCall(rmode_)); return Assembler::target_address_at(pc_, constant_pool_); } Address RelocInfo::target_address_address() { - DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_) || - IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) || - IsOffHeapTarget(rmode_)); + DCHECK(HasTargetAddressAddress()); // 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. @@ -121,16 +122,16 @@ Address Assembler::target_address_from_return_address(Address pc) { } void Assembler::deserialization_set_special_target_at( - Address instruction_payload, Code* code, Address target) { + Address instruction_payload, Code code, Address target) { if (IsMipsArchVariant(kMips32r6)) { // On R6 the address location is shifted by one instruction set_target_address_at( instruction_payload - (kInstructionsFor32BitConstant - 1) * kInstrSize, - code ? code->constant_pool() : kNullAddress, target); + !code.is_null() ? code->constant_pool() : kNullAddress, target); } else { set_target_address_at( instruction_payload - kInstructionsFor32BitConstant * kInstrSize, - code ? code->constant_pool() : kNullAddress, target); + !code.is_null() ? code->constant_pool() : kNullAddress, target); } } @@ -158,9 +159,8 @@ void Assembler::set_target_internal_reference_encoded_at(Address pc, Assembler::instr_at_put(pc + 1 * kInstrSize, instr2 | jic_offset_u); } else { // Encoded internal references are lui/ori load of 32-bit absolute address. - Assembler::instr_at_put(pc + 0 * kInstrSize, - instr1 | ((imm >> kLuiShift) & kImm16Mask)); - Assembler::instr_at_put(pc + 1 * kInstrSize, instr2 | (imm & kImm16Mask)); + PatchLuiOriImmediate(pc, imm, instr1, 0 * kInstrSize, instr2, + 1 * kInstrSize); } // Currently used only by deserializer, and all code will be flushed @@ -169,59 +169,60 @@ void Assembler::set_target_internal_reference_encoded_at(Address pc, void Assembler::deserialization_set_target_internal_reference_at( Address pc, Address target, RelocInfo::Mode mode) { - if (mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { + if (RelocInfo::IsInternalReferenceEncoded(mode)) { DCHECK(IsLui(instr_at(pc))); set_target_internal_reference_encoded_at(pc, target); } else { - DCHECK(mode == RelocInfo::INTERNAL_REFERENCE); + DCHECK(RelocInfo::IsInternalReference(mode)); Memory<Address>(pc) = target; } } -HeapObject* RelocInfo::target_object() { - DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); - return HeapObject::cast(reinterpret_cast<Object*>( - Assembler::target_address_at(pc_, constant_pool_))); +HeapObject RelocInfo::target_object() { + DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObject(rmode_)); + return HeapObject::cast( + Object(Assembler::target_address_at(pc_, constant_pool_))); } Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { - DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); - return Handle<HeapObject>(reinterpret_cast<HeapObject**>( - Assembler::target_address_at(pc_, constant_pool_))); + if (IsCodeTarget(rmode_) || IsEmbeddedObject(rmode_)) { + return Handle<HeapObject>(reinterpret_cast<Address*>( + Assembler::target_address_at(pc_, constant_pool_))); + } + DCHECK(IsRelativeCodeTarget(rmode_)); + return origin->relative_code_target_object_handle_at(pc_); } -void RelocInfo::set_target_object(Heap* heap, HeapObject* target, +void RelocInfo::set_target_object(Heap* heap, HeapObject target, WriteBarrierMode write_barrier_mode, ICacheFlushMode icache_flush_mode) { - DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); - Assembler::set_target_address_at(pc_, constant_pool_, - reinterpret_cast<Address>(target), + DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObject(rmode_)); + Assembler::set_target_address_at(pc_, constant_pool_, target->ptr(), icache_flush_mode); - if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != nullptr) { + if (write_barrier_mode == UPDATE_WRITE_BARRIER && !host().is_null()) { WriteBarrierForCode(host(), this, target); } } - Address RelocInfo::target_external_reference() { - DCHECK(rmode_ == EXTERNAL_REFERENCE); + DCHECK(IsExternalReference(rmode_)); return Assembler::target_address_at(pc_, constant_pool_); } void RelocInfo::set_target_external_reference( Address target, ICacheFlushMode icache_flush_mode) { - DCHECK(rmode_ == RelocInfo::EXTERNAL_REFERENCE); + DCHECK(IsExternalReference(rmode_)); Assembler::set_target_address_at(pc_, constant_pool_, target, icache_flush_mode); } Address RelocInfo::target_internal_reference() { - if (rmode_ == INTERNAL_REFERENCE) { + if (IsInternalReference(rmode_)) { return Memory<Address>(pc_); } else { // Encoded internal references are lui/ori or lui/jic load of 32-bit // absolute address. - DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); + DCHECK(IsInternalReferenceEncoded(rmode_)); Instr instr1 = Assembler::instr_at(pc_ + 0 * kInstrSize); Instr instr2 = Assembler::instr_at(pc_ + 1 * kInstrSize); DCHECK(Assembler::IsLui(instr1)); @@ -230,15 +231,13 @@ Address RelocInfo::target_internal_reference() { return static_cast<Address>( Assembler::CreateTargetAddress(instr1, instr2)); } - int32_t imm = (instr1 & static_cast<int32_t>(kImm16Mask)) << kLuiShift; - imm |= (instr2 & static_cast<int32_t>(kImm16Mask)); - return static_cast<Address>(imm); + return static_cast<Address>(Assembler::GetLuiOriImmediate(instr1, instr2)); } } Address RelocInfo::target_internal_reference_address() { - DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); + DCHECK(IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); return pc_; } @@ -274,21 +273,35 @@ void RelocInfo::WipeOut() { } } +Handle<Code> Assembler::relative_code_target_object_handle_at( + Address pc) const { + Instr instr1 = instr_at(pc); + Instr instr2 = instr_at(pc + kInstrSize); + DCHECK(IsLui(instr1)); + DCHECK(IsOri(instr2) || IsNal(instr2)); + DCHECK(IsNal(instr2) || IsNal(instr_at(pc - kInstrSize))); + if (IsNal(instr2)) { + instr2 = instr_at(pc + 2 * kInstrSize); + } + // Interpret 2 instructions generated by li (lui/ori). + int code_target_index = GetLuiOriImmediate(instr1, instr2); + return GetCodeTarget(code_target_index); +} + template <typename ObjectVisitor> void RelocInfo::Visit(ObjectVisitor* visitor) { - RelocInfo::Mode mode = rmode(); - if (mode == RelocInfo::EMBEDDED_OBJECT) { + Mode mode = rmode(); + if (IsEmbeddedObject(mode)) { visitor->VisitEmbeddedPointer(host(), this); - } else if (RelocInfo::IsCodeTargetMode(mode)) { + } else if (IsCodeTargetMode(mode)) { visitor->VisitCodeTarget(host(), this); - } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { + } else if (IsExternalReference(mode)) { visitor->VisitExternalReference(host(), this); - } else if (mode == RelocInfo::INTERNAL_REFERENCE || - mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { + } else if (IsInternalReference(mode) || IsInternalReferenceEncoded(mode)) { visitor->VisitInternalReference(host(), this); - } else if (RelocInfo::IsRuntimeEntry(mode)) { + } else if (IsRuntimeEntry(mode)) { visitor->VisitRuntimeEntry(host(), this); - } else if (RelocInfo::IsOffHeapTarget(mode)) { + } else if (IsOffHeapTarget(mode)) { visitor->VisitOffHeapTarget(host(), this); } } |