Commit 28df7e80 authored by Yu Yin's avatar Yu Yin Committed by Commit Bot

[mips][ptr-compr] New RelocInfo for compressed pointers.

port https://crrev.com/c/1588461 to mips.

Change-Id: I40c92d080e7acb8a6af786a6b979ddc2e9b635ac
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1596044Reviewed-by: 's avatarMichael Stanton <mvstanton@chromium.org>
Commit-Queue: Yu Yin <xwafish@gmail.com>
Cr-Commit-Position: refs/heads/master@{#61227}
parent cd59cb86
...@@ -171,13 +171,17 @@ void Assembler::deserialization_set_target_internal_reference_at( ...@@ -171,13 +171,17 @@ void Assembler::deserialization_set_target_internal_reference_at(
} }
HeapObject RelocInfo::target_object() { HeapObject RelocInfo::target_object() {
DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObject(rmode_)); DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
return HeapObject::cast( return HeapObject::cast(
Object(Assembler::target_address_at(pc_, constant_pool_))); Object(Assembler::target_address_at(pc_, constant_pool_)));
} }
HeapObject RelocInfo::target_object_no_host(Isolate* isolate) {
return target_object();
}
Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
if (IsCodeTarget(rmode_) || IsEmbeddedObject(rmode_)) { if (IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_)) {
return Handle<HeapObject>(reinterpret_cast<Address*>( return Handle<HeapObject>(reinterpret_cast<Address*>(
Assembler::target_address_at(pc_, constant_pool_))); Assembler::target_address_at(pc_, constant_pool_)));
} }
...@@ -188,7 +192,7 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { ...@@ -188,7 +192,7 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
void RelocInfo::set_target_object(Heap* heap, HeapObject target, void RelocInfo::set_target_object(Heap* heap, HeapObject target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObject(rmode_)); DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
Assembler::set_target_address_at(pc_, constant_pool_, target->ptr(), Assembler::set_target_address_at(pc_, constant_pool_, target->ptr(),
icache_flush_mode); icache_flush_mode);
if (write_barrier_mode == UPDATE_WRITE_BARRIER && !host().is_null()) { if (write_barrier_mode == UPDATE_WRITE_BARRIER && !host().is_null()) {
...@@ -252,7 +256,7 @@ Address RelocInfo::target_off_heap_target() { ...@@ -252,7 +256,7 @@ Address RelocInfo::target_off_heap_target() {
} }
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsFullEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) || IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
IsOffHeapTarget(rmode_)); IsOffHeapTarget(rmode_));
......
...@@ -213,21 +213,21 @@ uint32_t RelocInfo::wasm_call_tag() const { ...@@ -213,21 +213,21 @@ uint32_t RelocInfo::wasm_call_tag() const {
// See assembler-mips-inl.h for inlined constructors. // See assembler-mips-inl.h for inlined constructors.
Operand::Operand(Handle<HeapObject> handle) Operand::Operand(Handle<HeapObject> handle)
: rm_(no_reg), rmode_(RelocInfo::EMBEDDED_OBJECT) { : rm_(no_reg), rmode_(RelocInfo::FULL_EMBEDDED_OBJECT) {
value_.immediate = static_cast<intptr_t>(handle.address()); value_.immediate = static_cast<intptr_t>(handle.address());
} }
Operand Operand::EmbeddedNumber(double value) { Operand Operand::EmbeddedNumber(double value) {
int32_t smi; int32_t smi;
if (DoubleToSmiInteger(value, &smi)) return Operand(Smi::FromInt(smi)); if (DoubleToSmiInteger(value, &smi)) return Operand(Smi::FromInt(smi));
Operand result(0, RelocInfo::EMBEDDED_OBJECT); Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
result.is_heap_object_request_ = true; result.is_heap_object_request_ = true;
result.value_.heap_object_request = HeapObjectRequest(value); result.value_.heap_object_request = HeapObjectRequest(value);
return result; return result;
} }
Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) { Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) {
Operand result(0, RelocInfo::EMBEDDED_OBJECT); Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
result.is_heap_object_request_ = true; result.is_heap_object_request_ = true;
result.value_.heap_object_request = HeapObjectRequest(str); result.value_.heap_object_request = HeapObjectRequest(str);
return result; return result;
......
...@@ -98,7 +98,7 @@ class Operand { ...@@ -98,7 +98,7 @@ class Operand {
bool IsHeapObjectRequest() const { bool IsHeapObjectRequest() const {
DCHECK_IMPLIES(is_heap_object_request_, IsImmediate()); DCHECK_IMPLIES(is_heap_object_request_, IsImmediate());
DCHECK_IMPLIES(is_heap_object_request_, DCHECK_IMPLIES(is_heap_object_request_,
rmode_ == RelocInfo::EMBEDDED_OBJECT || rmode_ == RelocInfo::FULL_EMBEDDED_OBJECT ||
rmode_ == RelocInfo::CODE_TARGET); rmode_ == RelocInfo::CODE_TARGET);
return is_heap_object_request_; return is_heap_object_request_;
} }
......
...@@ -150,13 +150,17 @@ void Assembler::deserialization_set_target_internal_reference_at( ...@@ -150,13 +150,17 @@ void Assembler::deserialization_set_target_internal_reference_at(
} }
HeapObject RelocInfo::target_object() { HeapObject RelocInfo::target_object() {
DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
return HeapObject::cast( return HeapObject::cast(
Object(Assembler::target_address_at(pc_, constant_pool_))); Object(Assembler::target_address_at(pc_, constant_pool_)));
} }
HeapObject RelocInfo::target_object_no_host(Isolate* isolate) {
return target_object();
}
Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
return Handle<HeapObject>(reinterpret_cast<Address*>( return Handle<HeapObject>(reinterpret_cast<Address*>(
Assembler::target_address_at(pc_, constant_pool_))); Assembler::target_address_at(pc_, constant_pool_)));
} }
...@@ -164,7 +168,7 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { ...@@ -164,7 +168,7 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
void RelocInfo::set_target_object(Heap* heap, HeapObject target, void RelocInfo::set_target_object(Heap* heap, HeapObject target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
Assembler::set_target_address_at(pc_, constant_pool_, target->ptr(), Assembler::set_target_address_at(pc_, constant_pool_, target->ptr(),
icache_flush_mode); icache_flush_mode);
if (write_barrier_mode == UPDATE_WRITE_BARRIER && !host().is_null()) { if (write_barrier_mode == UPDATE_WRITE_BARRIER && !host().is_null()) {
...@@ -223,7 +227,7 @@ Address RelocInfo::target_off_heap_target() { ...@@ -223,7 +227,7 @@ Address RelocInfo::target_off_heap_target() {
} }
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsFullEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) || IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
IsOffHeapTarget(rmode_)); IsOffHeapTarget(rmode_));
......
...@@ -190,21 +190,21 @@ uint32_t RelocInfo::wasm_call_tag() const { ...@@ -190,21 +190,21 @@ uint32_t RelocInfo::wasm_call_tag() const {
// See assembler-mips-inl.h for inlined constructors. // See assembler-mips-inl.h for inlined constructors.
Operand::Operand(Handle<HeapObject> handle) Operand::Operand(Handle<HeapObject> handle)
: rm_(no_reg), rmode_(RelocInfo::EMBEDDED_OBJECT) { : rm_(no_reg), rmode_(RelocInfo::FULL_EMBEDDED_OBJECT) {
value_.immediate = static_cast<intptr_t>(handle.address()); value_.immediate = static_cast<intptr_t>(handle.address());
} }
Operand Operand::EmbeddedNumber(double value) { Operand Operand::EmbeddedNumber(double value) {
int32_t smi; int32_t smi;
if (DoubleToSmiInteger(value, &smi)) return Operand(Smi::FromInt(smi)); if (DoubleToSmiInteger(value, &smi)) return Operand(Smi::FromInt(smi));
Operand result(0, RelocInfo::EMBEDDED_OBJECT); Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
result.is_heap_object_request_ = true; result.is_heap_object_request_ = true;
result.value_.heap_object_request = HeapObjectRequest(value); result.value_.heap_object_request = HeapObjectRequest(value);
return result; return result;
} }
Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) { Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) {
Operand result(0, RelocInfo::EMBEDDED_OBJECT); Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
result.is_heap_object_request_ = true; result.is_heap_object_request_ = true;
result.value_.heap_object_request = HeapObjectRequest(str); result.value_.heap_object_request = HeapObjectRequest(str);
return result; return result;
......
...@@ -96,7 +96,7 @@ class Operand { ...@@ -96,7 +96,7 @@ class Operand {
bool IsHeapObjectRequest() const { bool IsHeapObjectRequest() const {
DCHECK_IMPLIES(is_heap_object_request_, IsImmediate()); DCHECK_IMPLIES(is_heap_object_request_, IsImmediate());
DCHECK_IMPLIES(is_heap_object_request_, DCHECK_IMPLIES(is_heap_object_request_,
rmode_ == RelocInfo::EMBEDDED_OBJECT || rmode_ == RelocInfo::FULL_EMBEDDED_OBJECT ||
rmode_ == RelocInfo::CODE_TARGET); rmode_ == RelocInfo::CODE_TARGET);
return is_heap_object_request_; return is_heap_object_request_;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment