diff options
Diffstat (limited to 'deps/v8/src/mips64/assembler-mips64.cc')
-rw-r--r-- | deps/v8/src/mips64/assembler-mips64.cc | 115 |
1 files changed, 41 insertions, 74 deletions
diff --git a/deps/v8/src/mips64/assembler-mips64.cc b/deps/v8/src/mips64/assembler-mips64.cc index 3449537626..10e4806337 100644 --- a/deps/v8/src/mips64/assembler-mips64.cc +++ b/deps/v8/src/mips64/assembler-mips64.cc @@ -37,9 +37,9 @@ #if V8_TARGET_ARCH_MIPS64 #include "src/base/cpu.h" -#include "src/code-stubs.h" #include "src/deoptimizer.h" #include "src/mips64/assembler-mips64-inl.h" +#include "src/objects/heap-number-inl.h" #include "src/string-constants.h" namespace v8 { @@ -179,23 +179,6 @@ bool RelocInfo::IsInConstantPool() { return false; } -int RelocInfo::GetDeoptimizationId(Isolate* isolate, DeoptimizeKind kind) { - DCHECK(IsRuntimeEntry(rmode_)); - return Deoptimizer::GetDeoptimizationId(isolate, target_address(), kind); -} - -void RelocInfo::set_js_to_wasm_address(Address address, - ICacheFlushMode icache_flush_mode) { - DCHECK_EQ(rmode_, JS_TO_WASM_CALL); - Assembler::set_target_address_at(pc_, constant_pool_, address, - icache_flush_mode); -} - -Address RelocInfo::js_to_wasm_address() const { - DCHECK_EQ(rmode_, JS_TO_WASM_CALL); - return Assembler::target_address_at(pc_, constant_pool_); -} - uint32_t RelocInfo::wasm_call_tag() const { DCHECK(rmode_ == WASM_CALL || rmode_ == WASM_STUB_CALL); return static_cast<uint32_t>( @@ -220,13 +203,6 @@ Operand Operand::EmbeddedNumber(double value) { return result; } -Operand Operand::EmbeddedCode(CodeStub* stub) { - Operand result(0, RelocInfo::CODE_TARGET); - result.is_heap_object_request_ = true; - result.value_.heap_object_request = HeapObjectRequest(stub); - return result; -} - Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) { Operand result(0, RelocInfo::EMBEDDED_OBJECT); result.is_heap_object_request_ = true; @@ -254,17 +230,13 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) { object = isolate->factory()->NewHeapNumber(request.heap_number(), TENURED); break; - case HeapObjectRequest::kCodeStub: - request.code_stub()->set_isolate(isolate); - object = request.code_stub()->GetCode(); - break; case HeapObjectRequest::kStringConstant: const StringConstantBase* str = request.string(); CHECK_NOT_NULL(str); object = str->AllocateStringConstant(isolate); break; } - Address pc = reinterpret_cast<Address>(buffer_) + request.offset(); + Address pc = reinterpret_cast<Address>(buffer_start_) + request.offset(); set_target_value_at(pc, reinterpret_cast<uint64_t>(object.location())); } } @@ -305,11 +277,11 @@ const Instr kLwSwInstrTypeMask = 0xFFE00000; const Instr kLwSwInstrArgumentMask = ~kLwSwInstrTypeMask; const Instr kLwSwOffsetMask = kImm16Mask; -Assembler::Assembler(const AssemblerOptions& options, void* buffer, - int buffer_size) - : AssemblerBase(options, buffer, buffer_size), +Assembler::Assembler(const AssemblerOptions& options, + std::unique_ptr<AssemblerBuffer> buffer) + : AssemblerBase(options, std::move(buffer)), scratch_register_list_(at.bit()) { - reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); + reloc_info_writer.Reposition(buffer_start_ + buffer_->size(), pc_); last_trampoline_pool_end_ = 0; no_trampoline_pool_before_ = 0; @@ -328,20 +300,24 @@ Assembler::Assembler(const AssemblerOptions& options, void* buffer, void Assembler::GetCode(Isolate* isolate, CodeDesc* desc) { EmitForbiddenSlotInstruction(); + + int code_comments_size = WriteCodeComments(); + DCHECK(pc_ <= reloc_info_writer.pos()); // No overlap. AllocateAndInstallRequestedHeapObjects(isolate); // Set up code descriptor. - desc->buffer = buffer_; - desc->buffer_size = buffer_size_; + desc->buffer = buffer_start_; + desc->buffer_size = buffer_->size(); desc->instr_size = pc_offset(); - desc->reloc_size = - static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer.pos()); + desc->reloc_size = static_cast<int>((buffer_start_ + desc->buffer_size) - + reloc_info_writer.pos()); desc->origin = this; desc->constant_pool_size = 0; desc->unwinding_info_size = 0; desc->unwinding_info = nullptr; + desc->code_comments_size = code_comments_size; } @@ -778,7 +754,7 @@ static inline int32_t AddBranchOffset(int pos, Instr instr) { int Assembler::target_at(int pos, bool is_internal) { if (is_internal) { - int64_t* p = reinterpret_cast<int64_t*>(buffer_ + pos); + int64_t* p = reinterpret_cast<int64_t*>(buffer_start_ + pos); int64_t address = *p; if (address == kEndOfJumpChain) { return kEndOfChain; @@ -852,7 +828,7 @@ int Assembler::target_at(int pos, bool is_internal) { // EndOfChain sentinel is returned directly, not relative to pc or pos. return kEndOfChain; } else { - uint64_t instr_address = reinterpret_cast<int64_t>(buffer_ + pos); + uint64_t instr_address = reinterpret_cast<int64_t>(buffer_start_ + pos); DCHECK(instr_address - imm < INT_MAX); int delta = static_cast<int>(instr_address - imm); DCHECK(pos > delta); @@ -891,15 +867,15 @@ static inline Instr SetBranchOffset(int32_t pos, int32_t target_pos, void Assembler::target_at_put(int pos, int target_pos, bool is_internal) { if (is_internal) { - uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos; - *reinterpret_cast<uint64_t*>(buffer_ + pos) = imm; + uint64_t imm = reinterpret_cast<uint64_t>(buffer_start_) + target_pos; + *reinterpret_cast<uint64_t*>(buffer_start_ + pos) = imm; return; } Instr instr = instr_at(pos); if ((instr & ~kImm16Mask) == 0) { DCHECK(target_pos == kEndOfChain || target_pos >= 0); // Emitted label constant, not part of a branch. - // Make label relative to Code* of generated Code object. + // Make label relative to Code pointer of generated Code object. instr_at_put(pos, target_pos + (Code::kHeaderSize - kHeapObjectTag)); return; } @@ -943,7 +919,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool is_internal) { DCHECK(IsOri(instr_ori)); DCHECK(IsOri(instr_ori2)); - uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos; + uint64_t imm = reinterpret_cast<uint64_t>(buffer_start_) + target_pos; DCHECK_EQ(imm & 3, 0); instr_lui &= ~kImm16Mask; @@ -1462,7 +1438,7 @@ uint64_t Assembler::jump_address(Label* L) { return kEndOfJumpChain; } } - uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos; + uint64_t imm = reinterpret_cast<uint64_t>(buffer_start_) + target_pos; DCHECK_EQ(imm & 3, 0); return imm; @@ -4130,48 +4106,40 @@ int Assembler::RelocateInternalReference(RelocInfo::Mode rmode, Address pc, void Assembler::GrowBuffer() { - if (!own_buffer_) FATAL("external code buffer is too small"); - // Compute new buffer size. - CodeDesc desc; // the new buffer - if (buffer_size_ < 1 * MB) { - desc.buffer_size = 2*buffer_size_; - } else { - desc.buffer_size = buffer_size_ + 1*MB; - } + int old_size = buffer_->size(); + int new_size = std::min(2 * old_size, old_size + 1 * MB); // Some internal data structures overflow for very large buffers, // they must ensure that kMaximalBufferSize is not too large. - if (desc.buffer_size > kMaximalBufferSize) { + if (new_size > kMaximalBufferSize) { V8::FatalProcessOutOfMemory(nullptr, "Assembler::GrowBuffer"); } // Set up new buffer. - desc.buffer = NewArray<byte>(desc.buffer_size); - desc.origin = this; - - desc.instr_size = pc_offset(); - desc.reloc_size = - static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer.pos()); + std::unique_ptr<AssemblerBuffer> new_buffer = buffer_->Grow(new_size); + DCHECK_EQ(new_size, new_buffer->size()); + byte* new_start = new_buffer->start(); // Copy the data. - intptr_t pc_delta = desc.buffer - buffer_; - intptr_t rc_delta = (desc.buffer + desc.buffer_size) - - (buffer_ + buffer_size_); - MemMove(desc.buffer, buffer_, desc.instr_size); - MemMove(reloc_info_writer.pos() + rc_delta, - reloc_info_writer.pos(), desc.reloc_size); + intptr_t pc_delta = new_start - buffer_start_; + intptr_t rc_delta = (new_start + new_size) - (buffer_start_ + old_size); + size_t reloc_size = (buffer_start_ + old_size) - reloc_info_writer.pos(); + MemMove(new_start, buffer_start_, pc_offset()); + MemMove(reloc_info_writer.pos() + rc_delta, reloc_info_writer.pos(), + reloc_size); // Switch buffers. - DeleteArray(buffer_); - buffer_ = desc.buffer; - buffer_size_ = desc.buffer_size; + buffer_ = std::move(new_buffer); + buffer_start_ = new_start; pc_ += pc_delta; reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, reloc_info_writer.last_pc() + pc_delta); // Relocate runtime entries. - for (RelocIterator it(desc); !it.done(); it.next()) { + Vector<byte> instructions{buffer_start_, pc_offset()}; + Vector<const byte> reloc_info{reloc_info_writer.pos(), reloc_size}; + for (RelocIterator it(instructions, reloc_info, 0); !it.done(); it.next()) { RelocInfo::Mode rmode = it.rinfo()->rmode(); if (rmode == RelocInfo::INTERNAL_REFERENCE) { RelocateInternalReference(rmode, it.rinfo()->pc(), pc_delta); @@ -4203,7 +4171,7 @@ void Assembler::dd(Label* label) { uint64_t data; CheckForEmitInForbiddenSlot(); if (label->is_bound()) { - data = reinterpret_cast<uint64_t>(buffer_ + label->pos()); + data = reinterpret_cast<uint64_t>(buffer_start_ + label->pos()); } else { data = jump_address(label); unbound_labels_count_++; @@ -4217,7 +4185,7 @@ void Assembler::dd(Label* label) { void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { if (!ShouldRecordRelocInfo(rmode)) return; // We do not try to reuse pool constants. - RelocInfo rinfo(reinterpret_cast<Address>(pc_), rmode, data, nullptr); + RelocInfo rinfo(reinterpret_cast<Address>(pc_), rmode, data, Code()); DCHECK_GE(buffer_space(), kMaxRelocSize); // Too late to grow buffer here. reloc_info_writer.Write(&rinfo); } @@ -4327,11 +4295,10 @@ Address Assembler::target_address_at(Address pc) { // qNaN is a MIPS sNaN, and ia32 sNaN is MIPS qNaN. If running from a heap // snapshot generated on ia32, the resulting MIPS sNaN must be quieted. // OS::nan_value() returns a qNaN. -void Assembler::QuietNaN(HeapObject* object) { +void Assembler::QuietNaN(HeapObject object) { HeapNumber::cast(object)->set_value(std::numeric_limits<double>::quiet_NaN()); } - // On Mips64, a target address is stored in a 4-instruction sequence: // 0: lui(rd, (j.imm64_ >> 32) & kImm16Mask); // 1: ori(rd, rd, (j.imm64_ >> 16) & kImm16Mask); |