Commit 85cebe73 authored by bjaideep's avatar bjaideep Committed by Commit bot

PPC/s390: Reland [heap] Avoid the use of cells to point from code to new-space objects.

Port 5e058540

Original commit message:

    The reason for reverting is: This breaks gc-stress bot:
    https://chromegw.corp.google.com/i/client.v8/builders/V8%20Linux64%20GC%20Stress%20-%20custom%20snapshot

    Abortion of compaction could cause duplicate entries in the typed-old-to-new remembered set.
    These duplicates could cause a DCHECK to trigger which checks that slots recorded in the
    remembered set never point to to-space. This reland-CL allows duplicates in the remembered
    set by removing the DCHECK, and additionally clears entries in the remembered set if objects are moved.

    Original issue's description:

    Cells were needed originally because there was no typed remembered set to
    record direct pointers from code space to new space. A previous
    CL (https://codereview.chromium.org/2003553002/) already introduced
    the remembered set, this CL uses it.

    This CL
    * stores direct pointers in code objects, even if the target is in new space,
    * records the slot of the pointer in typed-old-to-new remembered set,
    * adds a list which stores weak code-to-new-space references,
    * adds a test to test-heap.cc for weak code-to-new-space references,
    * removes prints in tail-call-megatest.js

R=ahaas@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com, mbrandy@us.ibm.com

BUG=
LOG=N

Review-Url: https://codereview.chromium.org/2108673003
Cr-Commit-Position: refs/heads/master@{#37346}
parent 588e15c0
...@@ -202,6 +202,7 @@ void RelocInfo::set_target_object(Object* target, ...@@ -202,6 +202,7 @@ void RelocInfo::set_target_object(Object* target,
target->IsHeapObject()) { target->IsHeapObject()) {
host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(
host(), this, HeapObject::cast(target)); host(), this, HeapObject::cast(target));
host()->GetHeap()->RecordWriteIntoCode(host(), this, target);
} }
} }
......
...@@ -193,7 +193,6 @@ Operand::Operand(Handle<Object> handle) { ...@@ -193,7 +193,6 @@ Operand::Operand(Handle<Object> handle) {
// Verify all Objects referred by code are NOT in new space. // Verify all Objects referred by code are NOT in new space.
Object* obj = *handle; Object* obj = *handle;
if (obj->IsHeapObject()) { if (obj->IsHeapObject()) {
DCHECK(!HeapObject::cast(obj)->GetHeap()->InNewSpace(obj));
imm_ = reinterpret_cast<intptr_t>(handle.location()); imm_ = reinterpret_cast<intptr_t>(handle.location());
rmode_ = RelocInfo::EMBEDDED_OBJECT; rmode_ = RelocInfo::EMBEDDED_OBJECT;
} else { } else {
......
...@@ -189,19 +189,7 @@ void MacroAssembler::Push(Handle<Object> handle) { ...@@ -189,19 +189,7 @@ void MacroAssembler::Push(Handle<Object> handle) {
void MacroAssembler::Move(Register dst, Handle<Object> value) { void MacroAssembler::Move(Register dst, Handle<Object> value) {
AllowDeferredHandleDereference smi_check; mov(dst, Operand(value));
if (value->IsSmi()) {
LoadSmiLiteral(dst, reinterpret_cast<Smi*>(*value));
} else {
DCHECK(value->IsHeapObject());
if (isolate()->heap()->InNewSpace(*value)) {
Handle<Cell> cell = isolate()->factory()->NewCell(value);
mov(dst, Operand(cell));
LoadP(dst, FieldMemOperand(dst, Cell::kValueOffset));
} else {
mov(dst, Operand(value));
}
}
} }
......
...@@ -177,6 +177,7 @@ void RelocInfo::set_target_object(Object* target, ...@@ -177,6 +177,7 @@ void RelocInfo::set_target_object(Object* target,
target->IsHeapObject()) { target->IsHeapObject()) {
host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(
host(), this, HeapObject::cast(target)); host(), this, HeapObject::cast(target));
host()->GetHeap()->RecordWriteIntoCode(host(), this, target);
} }
} }
......
...@@ -254,7 +254,6 @@ Operand::Operand(Handle<Object> handle) { ...@@ -254,7 +254,6 @@ Operand::Operand(Handle<Object> handle) {
// Verify all Objects referred by code are NOT in new space. // Verify all Objects referred by code are NOT in new space.
Object* obj = *handle; Object* obj = *handle;
if (obj->IsHeapObject()) { if (obj->IsHeapObject()) {
DCHECK(!HeapObject::cast(obj)->GetHeap()->InNewSpace(obj));
imm_ = reinterpret_cast<intptr_t>(handle.location()); imm_ = reinterpret_cast<intptr_t>(handle.location());
rmode_ = RelocInfo::EMBEDDED_OBJECT; rmode_ = RelocInfo::EMBEDDED_OBJECT;
} else { } else {
......
...@@ -170,19 +170,7 @@ void MacroAssembler::Push(Handle<Object> handle) { ...@@ -170,19 +170,7 @@ void MacroAssembler::Push(Handle<Object> handle) {
} }
void MacroAssembler::Move(Register dst, Handle<Object> value) { void MacroAssembler::Move(Register dst, Handle<Object> value) {
AllowDeferredHandleDereference smi_check; mov(dst, Operand(value));
if (value->IsSmi()) {
LoadSmiLiteral(dst, reinterpret_cast<Smi*>(*value));
} else {
DCHECK(value->IsHeapObject());
if (isolate()->heap()->InNewSpace(*value)) {
Handle<Cell> cell = isolate()->factory()->NewCell(value);
mov(dst, Operand(cell));
LoadP(dst, FieldMemOperand(dst, Cell::kValueOffset));
} else {
mov(dst, Operand(value));
}
}
} }
void MacroAssembler::Move(Register dst, Register src, Condition cond) { void MacroAssembler::Move(Register dst, Register src, Condition cond) {
......
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