Commit eefb5de4 authored by jgruber's avatar jgruber Committed by Commit Bot

[builtins] Wipe off-heap targets for serialization

For reproducible snapshots, we need to wipe target addresses.

Bug: v8:6666
Change-Id: Id30c3f92c342ae85e9dce677439a6f05182482cd
Reviewed-on: https://chromium-review.googlesource.com/1146653
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54626}
parent 1f5ab936
...@@ -170,7 +170,7 @@ Address RelocInfo::target_off_heap_target() { ...@@ -170,7 +170,7 @@ Address RelocInfo::target_off_heap_target() {
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_)); IsInternalReference(rmode_) || IsOffHeapTarget(rmode_));
if (IsInternalReference(rmode_)) { if (IsInternalReference(rmode_)) {
Memory::Address_at(pc_) = kNullAddress; Memory::Address_at(pc_) = kNullAddress;
} else { } else {
......
...@@ -762,7 +762,7 @@ Address RelocInfo::target_off_heap_target() { ...@@ -762,7 +762,7 @@ Address RelocInfo::target_off_heap_target() {
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_)); IsInternalReference(rmode_) || IsOffHeapTarget(rmode_));
if (IsInternalReference(rmode_)) { if (IsInternalReference(rmode_)) {
Memory::Address_at(pc_) = kNullAddress; Memory::Address_at(pc_) = kNullAddress;
} else { } else {
......
...@@ -271,7 +271,8 @@ Address RelocInfo::target_off_heap_target() { ...@@ -271,7 +271,8 @@ Address RelocInfo::target_off_heap_target() {
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
IsOffHeapTarget(rmode_));
if (IsInternalReference(rmode_)) { if (IsInternalReference(rmode_)) {
Memory::Address_at(pc_) = kNullAddress; Memory::Address_at(pc_) = kNullAddress;
} else if (IsInternalReferenceEncoded(rmode_)) { } else if (IsInternalReferenceEncoded(rmode_)) {
......
...@@ -233,7 +233,8 @@ Address RelocInfo::target_off_heap_target() { ...@@ -233,7 +233,8 @@ Address RelocInfo::target_off_heap_target() {
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
IsOffHeapTarget(rmode_));
if (IsInternalReference(rmode_)) { if (IsInternalReference(rmode_)) {
Memory::Address_at(pc_) = kNullAddress; Memory::Address_at(pc_) = kNullAddress;
} else if (IsInternalReferenceEncoded(rmode_)) { } else if (IsInternalReferenceEncoded(rmode_)) {
......
...@@ -220,11 +220,12 @@ Address RelocInfo::target_off_heap_target() { ...@@ -220,11 +220,12 @@ Address RelocInfo::target_off_heap_target() {
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
IsOffHeapTarget(rmode_));
if (IsInternalReference(rmode_)) { if (IsInternalReference(rmode_)) {
// Jump table entry // Jump table entry
Memory::Address_at(pc_) = kNullAddress; Memory::Address_at(pc_) = kNullAddress;
} else if (IsInternalReferenceEncoded(rmode_)) { } else if (IsInternalReferenceEncoded(rmode_) || IsOffHeapTarget(rmode_)) {
// mov sequence // mov sequence
// Currently used only by deserializer, no need to flush. // Currently used only by deserializer, no need to flush.
Assembler::set_target_address_at(pc_, constant_pool_, kNullAddress, Assembler::set_target_address_at(pc_, constant_pool_, kNullAddress,
......
...@@ -202,11 +202,12 @@ void RelocInfo::set_target_runtime_entry(Address target, ...@@ -202,11 +202,12 @@ void RelocInfo::set_target_runtime_entry(Address target,
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
IsOffHeapTarget(rmode_));
if (IsInternalReference(rmode_)) { if (IsInternalReference(rmode_)) {
// Jump table entry // Jump table entry
Memory::Address_at(pc_) = kNullAddress; Memory::Address_at(pc_) = kNullAddress;
} else if (IsInternalReferenceEncoded(rmode_)) { } else if (IsInternalReferenceEncoded(rmode_) || IsOffHeapTarget(rmode_)) {
// mov sequence // mov sequence
// Currently used only by deserializer, no need to flush. // Currently used only by deserializer, no need to flush.
Assembler::set_target_address_at(pc_, constant_pool_, kNullAddress, Assembler::set_target_address_at(pc_, constant_pool_, kNullAddress,
......
...@@ -1007,9 +1007,10 @@ void Serializer<AllocatorT>::ObjectSerializer::OutputCode(int size) { ...@@ -1007,9 +1007,10 @@ void Serializer<AllocatorT>::ObjectSerializer::OutputCode(int size) {
int mode_mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | int mode_mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) | RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED); RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET) |
RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
for (RelocIterator it(code, mode_mask); !it.done(); it.next()) { for (RelocIterator it(code, mode_mask); !it.done(); it.next()) {
RelocInfo* rinfo = it.rinfo(); RelocInfo* rinfo = it.rinfo();
rinfo->WipeOut(); rinfo->WipeOut();
......
...@@ -385,7 +385,7 @@ Address RelocInfo::target_off_heap_target() { ...@@ -385,7 +385,7 @@ Address RelocInfo::target_off_heap_target() {
void RelocInfo::WipeOut() { void RelocInfo::WipeOut() {
if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) || if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) ||
IsInternalReference(rmode_)) { IsInternalReference(rmode_) || IsOffHeapTarget(rmode_)) {
Memory::Address_at(pc_) = kNullAddress; Memory::Address_at(pc_) = kNullAddress;
} else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) {
// Effectively write zero into the relocation. // Effectively write zero into the relocation.
......
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