diff options
Diffstat (limited to 'deps/v8/src/ppc/assembler-ppc.cc')
-rw-r--r-- | deps/v8/src/ppc/assembler-ppc.cc | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/deps/v8/src/ppc/assembler-ppc.cc b/deps/v8/src/ppc/assembler-ppc.cc index 3386d5265d..c43b955210 100644 --- a/deps/v8/src/ppc/assembler-ppc.cc +++ b/deps/v8/src/ppc/assembler-ppc.cc @@ -41,6 +41,7 @@ #include "src/base/bits.h" #include "src/base/cpu.h" #include "src/code-stubs.h" +#include "src/deoptimizer.h" #include "src/macro-assembler.h" #include "src/ppc/assembler-ppc-inl.h" @@ -141,9 +142,9 @@ Register ToRegister(int num) { // ----------------------------------------------------------------------------- // Implementation of RelocInfo -const int RelocInfo::kApplyMask = 1 << RelocInfo::INTERNAL_REFERENCE | - 1 << RelocInfo::INTERNAL_REFERENCE_ENCODED; - +const int RelocInfo::kApplyMask = + RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | + RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED); bool RelocInfo::IsCodedSpecially() { // The deserializer needs to know whether a pointer is specially @@ -161,34 +162,27 @@ bool RelocInfo::IsInConstantPool() { return false; } -Address RelocInfo::embedded_address() const { - return Assembler::target_address_at(pc_, constant_pool_); -} - -uint32_t RelocInfo::embedded_size() const { - return static_cast<uint32_t>( - Assembler::target_address_at(pc_, constant_pool_)); -} - -void RelocInfo::set_embedded_address(Address address, - ICacheFlushMode flush_mode) { - Assembler::set_target_address_at(pc_, constant_pool_, address, flush_mode); -} - -void RelocInfo::set_embedded_size(uint32_t size, ICacheFlushMode flush_mode) { - Assembler::set_target_address_at(pc_, constant_pool_, - static_cast<Address>(size), flush_mode); +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); - set_embedded_address(address, icache_flush_mode); + 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 embedded_address(); + 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>( + Assembler::target_address_at(pc_, constant_pool_)); } // ----------------------------------------------------------------------------- @@ -228,8 +222,8 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) { Handle<HeapObject> object; switch (request.kind()) { case HeapObjectRequest::kHeapNumber: - object = isolate->factory()->NewHeapNumber(request.heap_number(), - IMMUTABLE, TENURED); + object = + isolate->factory()->NewHeapNumber(request.heap_number(), TENURED); break; case HeapObjectRequest::kCodeStub: request.code_stub()->set_isolate(isolate); @@ -247,8 +241,9 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) { // ----------------------------------------------------------------------------- // Specific instructions, constants, and masks. -Assembler::Assembler(IsolateData isolate_data, void* buffer, int buffer_size) - : AssemblerBase(isolate_data, buffer, buffer_size), +Assembler::Assembler(const AssemblerOptions& options, void* buffer, + int buffer_size) + : AssemblerBase(options, buffer, buffer_size), constant_pool_builder_(kLoadPtrMaxReachBits, kLoadDoubleMaxReachBits) { reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); @@ -504,7 +499,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { // pointer in a register. Register dst = Register::from_code(instr_at(pos + kInstrSize)); int32_t offset = target_pos + (Code::kHeaderSize - kHeapObjectTag); - PatchingAssembler patcher(isolate_data(), + PatchingAssembler patcher(options(), reinterpret_cast<byte*>(buffer_ + pos), 2); patcher.bitwise_mov32(dst, offset); break; @@ -520,7 +515,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { : (SIGN_EXT_IMM22(operands & kImm22Mask)); int32_t offset = target_pos + delta; PatchingAssembler patcher( - isolate_data(), reinterpret_cast<byte*>(buffer_ + pos), + options(), reinterpret_cast<byte*>(buffer_ + pos), 2 + static_cast<int32_t>(opcode == kUnboundAddLabelLongOffsetOpcode)); patcher.bitwise_add32(dst, base, offset); if (opcode == kUnboundAddLabelLongOffsetOpcode) patcher.nop(); @@ -529,7 +524,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { case kUnboundMovLabelAddrOpcode: { // Load the address of the label in a register. Register dst = Register::from_code(instr_at(pos + kInstrSize)); - PatchingAssembler patcher(isolate_data(), + PatchingAssembler patcher(options(), reinterpret_cast<byte*>(buffer_ + pos), kMovInstructionsNoConstantPool); // Keep internal references relative until EmitRelocations. @@ -537,7 +532,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { break; } case kUnboundJumpTableEntryOpcode: { - PatchingAssembler patcher(isolate_data(), + PatchingAssembler patcher(options(), reinterpret_cast<byte*>(buffer_ + pos), kPointerSize / kInstrSize); // Keep internal references relative until EmitRelocations. @@ -1305,7 +1300,7 @@ void Assembler::EnsureSpaceFor(int space_needed) { bool Operand::must_output_reloc_info(const Assembler* assembler) const { if (rmode_ == RelocInfo::EXTERNAL_REFERENCE) { if (assembler != nullptr && assembler->predictable_code_size()) return true; - return assembler->serializer_enabled(); + return assembler->options().record_reloc_info_for_serialization; } else if (RelocInfo::IsNone(rmode_)) { return false; } @@ -2075,10 +2070,11 @@ void Assembler::dp(uintptr_t data) { void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { + if (options().disable_reloc_info_for_patching) return; if (RelocInfo::IsNone(rmode) || // Don't record external references unless the heap will be serialized. - (rmode == RelocInfo::EXTERNAL_REFERENCE && !serializer_enabled() && - !emit_debug_code())) { + (RelocInfo::IsOnlyForSerializer(rmode) && + !options().record_reloc_info_for_serialization && !emit_debug_code())) { return; } DeferredRelocInfo rinfo(pc_offset(), rmode, data); @@ -2148,9 +2144,9 @@ void Assembler::CheckTrampolinePool() { } } -PatchingAssembler::PatchingAssembler(IsolateData isolate_data, byte* address, - int instructions) - : Assembler(isolate_data, address, instructions * kInstrSize + kGap) { +PatchingAssembler::PatchingAssembler(const AssemblerOptions& options, + byte* address, int instructions) + : Assembler(options, address, instructions * kInstrSize + kGap) { DCHECK_EQ(reloc_info_writer.pos(), buffer_ + buffer_size_); } |