From: balazs.kilvady Date: Wed, 18 Mar 2015 21:41:30 +0000 (-0700) Subject: MIPS: Serializer: serialize internal references via object visitor. X-Git-Tag: upstream/4.7.83~3757 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bd885aa0f92148bbae63a0b7af83c1f1cdfe879d;p=platform%2Fupstream%2Fv8.git MIPS: Serializer: serialize internal references via object visitor. Port 7c149afb6c875b1c53723384459dc14a0e961927 BUG= Review URL: https://codereview.chromium.org/1019083002 Cr-Commit-Position: refs/heads/master@{#27283} --- diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h index ca6250e64..ce3d47673 100644 --- a/src/mips/assembler-mips-inl.h +++ b/src/mips/assembler-mips-inl.h @@ -200,6 +200,28 @@ Address Assembler::break_address_from_return_address(Address pc) { } +void Assembler::deserialization_set_target_internal_reference_at( + Address pc, Address target) { + if (IsLui(instr_at(pc))) { + // 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(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)); + } else { + Memory::Address_at(pc) = target; + } +} + + Object* RelocInfo::target_object() { DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); return reinterpret_cast(Assembler::target_address_at(pc_, host_)); @@ -239,6 +261,7 @@ 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); @@ -251,27 +274,9 @@ Address RelocInfo::target_internal_reference() { } -void RelocInfo::set_target_internal_reference(Address target) { - if (rmode_ == INTERNAL_REFERENCE) { - Memory::Address_at(pc_) = target; - } 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)); - instr_lui &= ~kImm16Mask; - instr_ori &= ~kImm16Mask; - int32_t imm = reinterpret_cast(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. - } +Address RelocInfo::target_internal_reference_address() { + DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); + return reinterpret_cast
(pc_); } @@ -386,11 +391,28 @@ 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_)) { + 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 = 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. + } else { + Assembler::set_target_address_at(pc_, host_, NULL); + } } @@ -423,6 +445,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) && @@ -448,6 +473,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() && diff --git a/src/mips/assembler-mips.h b/src/mips/assembler-mips.h index 8f2e9983d..a50927f78 100644 --- a/src/mips/assembler-mips.h +++ b/src/mips/assembler-mips.h @@ -547,6 +547,10 @@ class Assembler : public AssemblerBase { target); } + // This sets the internal reference at the pc. + inline static void deserialization_set_target_internal_reference_at( + Address pc, Address target); + // Size of an instruction. static const int kInstrSize = sizeof(Instr); diff --git a/src/mips64/assembler-mips64-inl.h b/src/mips64/assembler-mips64-inl.h index e06c1c0f3..e8a27bcaa 100644 --- a/src/mips64/assembler-mips64-inl.h +++ b/src/mips64/assembler-mips64-inl.h @@ -194,6 +194,35 @@ Address Assembler::break_address_from_return_address(Address pc) { } +void Assembler::deserialization_set_target_internal_reference_at( + Address pc, Address target) { + if (IsLui(instr_at(pc))) { + // Encoded internal references are lui/ori load of 48-bit abolute address. + Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); + Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); + Instr instr_ori2 = Assembler::instr_at(pc + 3 * Assembler::kInstrSize); + DCHECK(Assembler::IsLui(instr_lui)); + DCHECK(Assembler::IsOri(instr_ori)); + DCHECK(Assembler::IsOri(instr_ori2)); + instr_lui &= ~kImm16Mask; + instr_ori &= ~kImm16Mask; + instr_ori2 &= ~kImm16Mask; + int64_t imm = reinterpret_cast(target); + DCHECK((imm & 3) == 0); + Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, + instr_lui | ((imm >> 32) & kImm16Mask)); + Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, + instr_ori | ((imm >> 16) & kImm16Mask)); + Assembler::instr_at_put(pc + 3 * 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. + } else { + Memory::Address_at(pc) = target; + } +} + + Object* RelocInfo::target_object() { DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); return reinterpret_cast(Assembler::target_address_at(pc_, host_)); @@ -233,6 +262,7 @@ Address RelocInfo::target_internal_reference() { if (rmode_ == INTERNAL_REFERENCE) { return Memory::Address_at(pc_); } else { + // Encoded internal references are lui/ori load of 48-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); @@ -248,32 +278,9 @@ Address RelocInfo::target_internal_reference() { } -void RelocInfo::set_target_internal_reference(Address target) { - if (rmode_ == INTERNAL_REFERENCE) { - Memory::Address_at(pc_) = target; - } else { - // Encoded internal references are lui/ori load of 48-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); - Instr instr_ori2 = Assembler::instr_at(pc_ + 3 * Assembler::kInstrSize); - DCHECK(Assembler::IsLui(instr_lui)); - DCHECK(Assembler::IsOri(instr_ori)); - DCHECK(Assembler::IsOri(instr_ori2)); - instr_lui &= ~kImm16Mask; - instr_ori &= ~kImm16Mask; - instr_ori2 &= ~kImm16Mask; - int64_t imm = reinterpret_cast(target); - DCHECK((imm & 3) == 0); - Assembler::instr_at_put(pc_ + 0 * Assembler::kInstrSize, - instr_lui | ((imm >> 32) & kImm16Mask)); - Assembler::instr_at_put(pc_ + 1 * Assembler::kInstrSize, - instr_ori | ((imm >> 16) & kImm16Mask)); - Assembler::instr_at_put(pc_ + 3 * 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. - } +Address RelocInfo::target_internal_reference_address() { + DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED); + return reinterpret_cast
(pc_); } @@ -388,11 +395,33 @@ 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_)) { + Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); + Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); + Instr instr_ori2 = Assembler::instr_at(pc_ + 3 * Assembler::kInstrSize); + DCHECK(Assembler::IsLui(instr_lui)); + DCHECK(Assembler::IsOri(instr_ori)); + DCHECK(Assembler::IsOri(instr_ori2)); + instr_lui &= ~kImm16Mask; + instr_ori &= ~kImm16Mask; + instr_ori2 &= ~kImm16Mask; + int64_t imm = 0; + Assembler::instr_at_put(pc_ + 0 * Assembler::kInstrSize, + instr_lui | ((imm >> 32) & kImm16Mask)); + Assembler::instr_at_put(pc_ + 1 * Assembler::kInstrSize, + instr_ori | ((imm >> 16) & kImm16Mask)); + Assembler::instr_at_put(pc_ + 3 * 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. + } else { + Assembler::set_target_address_at(pc_, host_, NULL); + } } @@ -428,6 +457,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) && @@ -453,6 +485,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() && diff --git a/src/mips64/assembler-mips64.h b/src/mips64/assembler-mips64.h index fbcf59a98..f643322dd 100644 --- a/src/mips64/assembler-mips64.h +++ b/src/mips64/assembler-mips64.h @@ -540,6 +540,10 @@ class Assembler : public AssemblerBase { target); } + // This sets the internal reference at the pc. + inline static void deserialization_set_target_internal_reference_at( + Address pc, Address target); + // Size of an instruction. static const int kInstrSize = sizeof(Instr);