diff options
Diffstat (limited to 'deps/v8/src/codegen/mips/assembler-mips.cc')
-rw-r--r-- | deps/v8/src/codegen/mips/assembler-mips.cc | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/deps/v8/src/codegen/mips/assembler-mips.cc b/deps/v8/src/codegen/mips/assembler-mips.cc index 2948dbd18a..0d5a8710e5 100644 --- a/deps/v8/src/codegen/mips/assembler-mips.cc +++ b/deps/v8/src/codegen/mips/assembler-mips.cc @@ -1988,11 +1988,11 @@ void Assembler::AdjustBaseAndOffset(MemOperand* src, constexpr int32_t kMaxOffsetForSimpleAdjustment = 2 * kMinOffsetForSimpleAdjustment; if (0 <= src->offset() && src->offset() <= kMaxOffsetForSimpleAdjustment) { - addiu(at, src->rm(), kMinOffsetForSimpleAdjustment); + addiu(scratch, src->rm(), kMinOffsetForSimpleAdjustment); src->offset_ -= kMinOffsetForSimpleAdjustment; } else if (-kMaxOffsetForSimpleAdjustment <= src->offset() && src->offset() < 0) { - addiu(at, src->rm(), -kMinOffsetForSimpleAdjustment); + addiu(scratch, src->rm(), -kMinOffsetForSimpleAdjustment); src->offset_ += kMinOffsetForSimpleAdjustment; } else if (IsMipsArchVariant(kMips32r6)) { // On r6 take advantage of the aui instruction, e.g.: @@ -3537,7 +3537,27 @@ void Assembler::RelocateRelativeReference(RelocInfo::Mode rmode, Address pc, } } +void Assembler::FixOnHeapReferences(bool update_embedded_objects) { + if (!update_embedded_objects) return; + for (auto p : saved_handles_for_raw_object_ptr_) { + Address address = reinterpret_cast<Address>(buffer_->start() + p.first); + Handle<HeapObject> object(reinterpret_cast<Address*>(p.second)); + set_target_value_at(address, object->ptr()); + } +} + +void Assembler::FixOnHeapReferencesToHandles() { + for (auto p : saved_handles_for_raw_object_ptr_) { + Address address = reinterpret_cast<Address>(buffer_->start() + p.first); + set_target_value_at(address, p.second); + } + saved_handles_for_raw_object_ptr_.clear(); +} + void Assembler::GrowBuffer() { + bool previously_on_heap = buffer_->IsOnHeap(); + int previous_on_heap_gc_count = OnHeapGCCount(); + // Compute new buffer size. int old_size = buffer_->size(); int new_size = std::min(2 * old_size, old_size + 1 * MB); @@ -3580,6 +3600,16 @@ void Assembler::GrowBuffer() { RelocateInternalReference(rmode, it.rinfo()->pc(), pc_delta); } } + + // Fix on-heap references. + if (previously_on_heap) { + if (buffer_->IsOnHeap()) { + FixOnHeapReferences(previous_on_heap_gc_count != OnHeapGCCount()); + } else { + FixOnHeapReferencesToHandles(); + } + } + DCHECK(!overflow()); } @@ -3592,7 +3622,8 @@ void Assembler::db(uint8_t data) { void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) { CheckForEmitInForbiddenSlot(); if (!RelocInfo::IsNone(rmode)) { - DCHECK(RelocInfo::IsDataEmbeddedObject(rmode)); + DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) || + RelocInfo::IsLiteralConstant(rmode)); RecordRelocInfo(rmode); } *reinterpret_cast<uint32_t*>(pc_) = data; @@ -3602,7 +3633,8 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) { void Assembler::dq(uint64_t data, RelocInfo::Mode rmode) { CheckForEmitInForbiddenSlot(); if (!RelocInfo::IsNone(rmode)) { - DCHECK(RelocInfo::IsDataEmbeddedObject(rmode)); + DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) || + RelocInfo::IsLiteralConstant(rmode)); RecordRelocInfo(rmode); } *reinterpret_cast<uint64_t*>(pc_) = data; |