X87: Reland [heap] Avoid the use of cells to point from code to new-space objects.
port 5e05854019
(r37325)
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 neve
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
BUG=
Review-Url: https://codereview.chromium.org/2112193002
Cr-Commit-Position: refs/heads/master@{#37466}
This commit is contained in:
parent
ba61ce5b51
commit
35f3143c6a
@ -138,8 +138,6 @@ void RelocInfo::set_target_object(Object* target,
|
||||
if (write_barrier_mode == UPDATE_WRITE_BARRIER &&
|
||||
host() != NULL &&
|
||||
target->IsHeapObject()) {
|
||||
host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(
|
||||
host(), this, HeapObject::cast(target));
|
||||
host()->GetHeap()->RecordWriteIntoCode(host(), this, target);
|
||||
}
|
||||
}
|
||||
@ -343,7 +341,6 @@ Immediate::Immediate(Handle<Object> handle) {
|
||||
// Verify all Objects referred by code are NOT in new space.
|
||||
Object* obj = *handle;
|
||||
if (obj->IsHeapObject()) {
|
||||
DCHECK(!HeapObject::cast(obj)->GetHeap()->InNewSpace(obj));
|
||||
x_ = reinterpret_cast<intptr_t>(handle.location());
|
||||
rmode_ = RelocInfo::EMBEDDED_OBJECT;
|
||||
} else {
|
||||
@ -382,7 +379,6 @@ void Assembler::emit(Handle<Object> handle) {
|
||||
AllowDeferredHandleDereference heap_object_check;
|
||||
// Verify all Objects referred by code are NOT in new space.
|
||||
Object* obj = *handle;
|
||||
DCHECK(!isolate()->heap()->InNewSpace(obj));
|
||||
if (obj->IsHeapObject()) {
|
||||
emit(reinterpret_cast<intptr_t>(handle.location()),
|
||||
RelocInfo::EMBEDDED_OBJECT);
|
||||
|
@ -2534,37 +2534,15 @@ int MacroAssembler::SafepointRegisterStackIndex(int reg_code) {
|
||||
|
||||
void MacroAssembler::LoadHeapObject(Register result,
|
||||
Handle<HeapObject> object) {
|
||||
AllowDeferredHandleDereference embedding_raw_address;
|
||||
if (isolate()->heap()->InNewSpace(*object)) {
|
||||
Handle<Cell> cell = isolate()->factory()->NewCell(object);
|
||||
mov(result, Operand::ForCell(cell));
|
||||
} else {
|
||||
mov(result, object);
|
||||
}
|
||||
mov(result, object);
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::CmpHeapObject(Register reg, Handle<HeapObject> object) {
|
||||
AllowDeferredHandleDereference using_raw_address;
|
||||
if (isolate()->heap()->InNewSpace(*object)) {
|
||||
Handle<Cell> cell = isolate()->factory()->NewCell(object);
|
||||
cmp(reg, Operand::ForCell(cell));
|
||||
} else {
|
||||
cmp(reg, object);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::PushHeapObject(Handle<HeapObject> object) {
|
||||
AllowDeferredHandleDereference using_raw_address;
|
||||
if (isolate()->heap()->InNewSpace(*object)) {
|
||||
Handle<Cell> cell = isolate()->factory()->NewCell(object);
|
||||
push(Operand::ForCell(cell));
|
||||
} else {
|
||||
Push(object);
|
||||
}
|
||||
cmp(reg, object);
|
||||
}
|
||||
|
||||
void MacroAssembler::PushHeapObject(Handle<HeapObject> object) { Push(object); }
|
||||
|
||||
void MacroAssembler::CmpWeakValue(Register value, Handle<WeakCell> cell,
|
||||
Register scratch) {
|
||||
|
Loading…
Reference in New Issue
Block a user