diff --git a/src/arm/assembler-arm-inl.h b/src/arm/assembler-arm-inl.h index 95f5361b44..52ebe32b36 100644 --- a/src/arm/assembler-arm-inl.h +++ b/src/arm/assembler-arm-inl.h @@ -138,7 +138,6 @@ void RelocInfo::set_target_object(Object* target, target->IsHeapObject()) { host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host(), this, HeapObject::cast(target)); - host()->GetHeap()->RecordWriteIntoCode(host(), this, target); } } diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc index d1eb6137f0..154e69be7f 100644 --- a/src/arm/assembler-arm.cc +++ b/src/arm/assembler-arm.cc @@ -275,6 +275,7 @@ Operand::Operand(Handle 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)); imm32_ = reinterpret_cast(handle.location()); rmode_ = RelocInfo::EMBEDDED_OBJECT; } else { diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index ce5ca09867..d8df4cda5c 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -240,7 +240,19 @@ void MacroAssembler::Push(Handle handle) { void MacroAssembler::Move(Register dst, Handle value) { - mov(dst, Operand(value)); + AllowDeferredHandleDereference smi_check; + if (value->IsSmi()) { + mov(dst, Operand(value)); + } else { + DCHECK(value->IsHeapObject()); + if (isolate()->heap()->InNewSpace(*value)) { + Handle cell = isolate()->factory()->NewCell(value); + mov(dst, Operand(cell)); + ldr(dst, FieldMemOperand(dst, Cell::kValueOffset)); + } else { + mov(dst, Operand(value)); + } + } } diff --git a/src/arm64/assembler-arm64-inl.h b/src/arm64/assembler-arm64-inl.h index a295ce0776..8e467713c0 100644 --- a/src/arm64/assembler-arm64-inl.h +++ b/src/arm64/assembler-arm64-inl.h @@ -731,7 +731,6 @@ void RelocInfo::set_target_object(Object* target, target->IsHeapObject()) { host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host(), this, HeapObject::cast(target)); - host()->GetHeap()->RecordWriteIntoCode(host(), this, target); } } diff --git a/src/arm64/assembler-arm64.cc b/src/arm64/assembler-arm64.cc index 339f2de905..7aea5bb135 100644 --- a/src/arm64/assembler-arm64.cc +++ b/src/arm64/assembler-arm64.cc @@ -280,6 +280,7 @@ void Immediate::InitializeHandle(Handle 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)); value_ = reinterpret_cast(handle.location()); rmode_ = RelocInfo::EMBEDDED_OBJECT; } else { diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc index 543dc7234b..86ddefa9ad 100644 --- a/src/arm64/macro-assembler-arm64.cc +++ b/src/arm64/macro-assembler-arm64.cc @@ -1425,7 +1425,14 @@ void MacroAssembler::LoadTrueFalseRoots(Register true_root, void MacroAssembler::LoadHeapObject(Register result, Handle object) { - Mov(result, Operand(object)); + AllowDeferredHandleDereference using_raw_address; + if (isolate()->heap()->InNewSpace(*object)) { + Handle cell = isolate()->factory()->NewCell(object); + Mov(result, Operand(cell)); + Ldr(result, FieldMemOperand(result, Cell::kValueOffset)); + } else { + Mov(result, Operand(object)); + } } diff --git a/src/compiler.cc b/src/compiler.cc index 997103f18f..2a0eda0a55 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -284,14 +284,9 @@ void AddWeakObjectToCodeDependency(Isolate* isolate, Handle object, Handle code) { Handle cell = Code::WeakCellFor(code); Heap* heap = isolate->heap(); - if (heap->InNewSpace(*object)) { - heap->AddWeakNewSpaceObjectToCodeDependency(object, cell); - } else { - Handle dep(heap->LookupWeakObjectToCodeDependency(object)); - dep = - DependentCode::InsertWeakCode(dep, DependentCode::kWeakCodeGroup, cell); - heap->AddWeakObjectToCodeDependency(object, dep); - } + Handle dep(heap->LookupWeakObjectToCodeDependency(object)); + dep = DependentCode::InsertWeakCode(dep, DependentCode::kWeakCodeGroup, cell); + heap->AddWeakObjectToCodeDependency(object, dep); } } // namespace diff --git a/src/heap/heap-inl.h b/src/heap/heap-inl.h index 137be98655..d6c509e4a3 100644 --- a/src/heap/heap-inl.h +++ b/src/heap/heap-inl.h @@ -426,12 +426,6 @@ void Heap::RecordWrite(Object* object, int offset, Object* o) { HeapObject::cast(object)->address() + offset); } -void Heap::RecordWriteIntoCode(Code* host, RelocInfo* rinfo, Object* value) { - if (InNewSpace(value)) { - RecordWriteIntoCodeSlow(host, rinfo, value); - } -} - void Heap::RecordFixedArrayElements(FixedArray* array, int offset, int length) { if (InNewSpace(array)) return; Page* page = Page::FromAddress(reinterpret_cast
(array)); diff --git a/src/heap/heap.cc b/src/heap/heap.cc index 3dc8ff9642..267991dc5c 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -1469,6 +1469,38 @@ void Heap::MarkCompactPrologue() { } +#ifdef VERIFY_HEAP +// Visitor class to verify pointers in code or data space do not point into +// new space. +class VerifyNonPointerSpacePointersVisitor : public ObjectVisitor { + public: + explicit VerifyNonPointerSpacePointersVisitor(Heap* heap) : heap_(heap) {} + + void VisitPointers(Object** start, Object** end) override { + for (Object** current = start; current < end; current++) { + if ((*current)->IsHeapObject()) { + CHECK(!heap_->InNewSpace(HeapObject::cast(*current))); + } + } + } + + private: + Heap* heap_; +}; + + +static void VerifyNonPointerSpacePointers(Heap* heap) { + // Verify that there are no pointers to new space in spaces where we + // do not expect them. + VerifyNonPointerSpacePointersVisitor v(heap); + HeapObjectIterator code_it(heap->code_space()); + for (HeapObject* object = code_it.Next(); object != NULL; + object = code_it.Next()) + object->Iterate(&v); +} +#endif // VERIFY_HEAP + + void Heap::CheckNewSpaceExpansionCriteria() { if (FLAG_experimental_new_space_growth_heuristic) { if (new_space_.TotalCapacity() < new_space_.MaximumCapacity() && @@ -1581,6 +1613,10 @@ void Heap::Scavenge() { mark_compact_collector()->sweeper().EnsureNewSpaceCompleted(); +#ifdef VERIFY_HEAP + if (FLAG_verify_heap) VerifyNonPointerSpacePointers(this); +#endif + gc_state_ = SCAVENGE; // Implements Cheney's copying algorithm @@ -2823,10 +2859,6 @@ void Heap::CreateInitialObjects() { *WeakHashTable::New(isolate(), 16, USE_DEFAULT_MINIMUM_CAPACITY, TENURED)); - set_weak_new_space_object_to_code_list( - ArrayList::cast(*(factory->NewFixedArray(16, TENURED)))); - weak_new_space_object_to_code_list()->SetLength(0); - set_script_list(Smi::FromInt(0)); Handle slow_element_dictionary = @@ -2886,6 +2918,7 @@ void Heap::CreateInitialObjects() { CreateFixedStubs(); } + bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { switch (root_index) { case kNumberStringCacheRootIndex: @@ -2900,7 +2933,6 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { case kMicrotaskQueueRootIndex: case kDetachedContextsRootIndex: case kWeakObjectToCodeTableRootIndex: - case kWeakNewSpaceObjectToCodeListRootIndex: case kRetainedMapsRootIndex: case kNoScriptSharedFunctionInfosRootIndex: case kWeakStackTraceListRootIndex: @@ -5532,18 +5564,6 @@ void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback) { UNREACHABLE(); } -// TODO(ishell): Find a better place for this. -void Heap::AddWeakNewSpaceObjectToCodeDependency(Handle obj, - Handle code) { - DCHECK(InNewSpace(*obj)); - DCHECK(!InNewSpace(*code)); - Handle list(weak_new_space_object_to_code_list(), isolate()); - list = ArrayList::Add(list, isolate()->factory()->NewWeakCell(obj), code); - if (*list != weak_new_space_object_to_code_list()) { - set_weak_new_space_object_to_code_list(*list); - } -} - // TODO(ishell): Find a better place for this. void Heap::AddWeakObjectToCodeDependency(Handle obj, Handle dep) { @@ -5699,26 +5719,6 @@ void Heap::ClearRecordedSlotRange(Address start, Address end) { } } -void Heap::RecordWriteIntoCodeSlow(Code* host, RelocInfo* rinfo, - Object* value) { - DCHECK(InNewSpace(value)); - Page* source_page = Page::FromAddress(reinterpret_cast
(host)); - RelocInfo::Mode rmode = rinfo->rmode(); - Address addr = rinfo->pc(); - SlotType slot_type = SlotTypeForRelocInfoMode(rmode); - if (rinfo->IsInConstantPool()) { - addr = rinfo->constant_pool_entry_address(); - if (RelocInfo::IsCodeTarget(rmode)) { - slot_type = CODE_ENTRY_SLOT; - } else { - DCHECK(RelocInfo::IsEmbeddedObject(rmode)); - slot_type = OBJECT_SLOT; - } - } - RememberedSet::InsertTyped( - source_page, reinterpret_cast
(host), slot_type, addr); -} - Space* AllSpaces::next() { switch (counter_++) { case NEW_SPACE: diff --git a/src/heap/heap.h b/src/heap/heap.h index 7f03d89abe..ed1e65253e 100644 --- a/src/heap/heap.h +++ b/src/heap/heap.h @@ -194,11 +194,6 @@ using v8::MemoryPressureLevel; V(FixedArray, detached_contexts, DetachedContexts) \ V(ArrayList, retained_maps, RetainedMaps) \ V(WeakHashTable, weak_object_to_code_table, WeakObjectToCodeTable) \ - /* weak_new_space_object_to_code_list is an array of weak cells, where */ \ - /* slots with even indices refer to the weak object, and the subsequent */ \ - /* slots refer to the code with the reference to the weak object. */ \ - V(ArrayList, weak_new_space_object_to_code_list, \ - WeakNewSpaceObjectToCodeList) \ V(Object, weak_stack_trace_list, WeakStackTraceList) \ V(Object, noscript_shared_function_infos, NoScriptSharedFunctionInfos) \ V(FixedArray, serialized_templates, SerializedTemplates) \ @@ -865,9 +860,6 @@ class Heap { return new_space_.IsAtMaximumCapacity() && maximum_size_scavenges_ == 0; } - void AddWeakNewSpaceObjectToCodeDependency(Handle obj, - Handle code); - void AddWeakObjectToCodeDependency(Handle obj, Handle dep); @@ -1128,8 +1120,6 @@ class Heap { // Write barrier support for object[offset] = o; inline void RecordWrite(Object* object, int offset, Object* o); - inline void RecordWriteIntoCode(Code* host, RelocInfo* rinfo, Object* target); - void RecordWriteIntoCodeSlow(Code* host, RelocInfo* rinfo, Object* target); inline void RecordFixedArrayElements(FixedArray* array, int offset, int length); diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc index cd0fd9c499..4e9fdc864c 100644 --- a/src/heap/mark-compact.cc +++ b/src/heap/mark-compact.cc @@ -1569,9 +1569,6 @@ class RecordMigratedSlotVisitor final : public ObjectVisitor { DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode())); Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); Code* host = rinfo->host(); - // The target is always in old space, we don't have to record the slot in - // the old-to-new remembered set. - DCHECK(!collector_->heap()->InNewSpace(target)); collector_->RecordRelocSlot(host, rinfo, target); } @@ -1580,9 +1577,6 @@ class RecordMigratedSlotVisitor final : public ObjectVisitor { rinfo->IsPatchedDebugBreakSlotSequence()); Code* target = Code::GetCodeFromTargetAddress(rinfo->debug_call_address()); Code* host = rinfo->host(); - // The target is always in old space, we don't have to record the slot in - // the old-to-new remembered set. - DCHECK(!collector_->heap()->InNewSpace(target)); collector_->RecordRelocSlot(host, rinfo, target); } @@ -1590,7 +1584,6 @@ class RecordMigratedSlotVisitor final : public ObjectVisitor { DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); HeapObject* object = HeapObject::cast(rinfo->target_object()); Code* host = rinfo->host(); - collector_->heap()->RecordWriteIntoCode(host, rinfo, object); collector_->RecordRelocSlot(host, rinfo, object); } @@ -1598,9 +1591,6 @@ class RecordMigratedSlotVisitor final : public ObjectVisitor { DCHECK(rinfo->rmode() == RelocInfo::CELL); Cell* cell = rinfo->target_cell(); Code* host = rinfo->host(); - // The cell is always in old space, we don't have to record the slot in - // the old-to-new remembered set. - DCHECK(!collector_->heap()->InNewSpace(cell)); collector_->RecordRelocSlot(host, rinfo, cell); } @@ -2466,35 +2456,6 @@ void MarkCompactCollector::MarkDependentCodeForDeoptimization( current = current->next_link(); } - { - ArrayList* list = heap_->weak_new_space_object_to_code_list(); - int counter = 0; - for (int i = 0; i < list->Length(); i += 2) { - WeakCell* obj = WeakCell::cast(list->Get(i)); - WeakCell* dep = WeakCell::cast(list->Get(i + 1)); - if (obj->cleared() || dep->cleared()) { - if (!dep->cleared()) { - Code* code = Code::cast(dep->value()); - if (!code->marked_for_deoptimization()) { - DependentCode::SetMarkedForDeoptimization( - code, DependentCode::DependencyGroup::kWeakCodeGroup); - code->InvalidateEmbeddedObjects(); - have_code_to_deoptimize_ = true; - } - } - } else { - // We record the slot manually because marking is finished at this - // point and the write barrier would bailout. - list->Set(counter, obj, SKIP_WRITE_BARRIER); - RecordSlot(list, list->Slot(counter), obj); - counter++; - list->Set(counter, dep, SKIP_WRITE_BARRIER); - RecordSlot(list, list->Slot(counter), dep); - counter++; - } - } - } - WeakHashTable* table = heap_->weak_object_to_code_table(); uint32_t capacity = table->Capacity(); for (uint32_t i = 0; i < capacity; i++) { @@ -2839,16 +2800,30 @@ void MarkCompactCollector::AbortTransitionArrays() { heap()->set_encountered_transition_arrays(Smi::FromInt(0)); } +static inline SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { + if (RelocInfo::IsCodeTarget(rmode)) { + return CODE_TARGET_SLOT; + } else if (RelocInfo::IsCell(rmode)) { + return CELL_TARGET_SLOT; + } else if (RelocInfo::IsEmbeddedObject(rmode)) { + return EMBEDDED_OBJECT_SLOT; + } else if (RelocInfo::IsDebugBreakSlot(rmode)) { + return DEBUG_TARGET_SLOT; + } + UNREACHABLE(); + return NUMBER_OF_SLOT_TYPES; +} + void MarkCompactCollector::RecordRelocSlot(Code* host, RelocInfo* rinfo, Object* target) { Page* target_page = Page::FromAddress(reinterpret_cast
(target)); Page* source_page = Page::FromAddress(reinterpret_cast
(host)); + RelocInfo::Mode rmode = rinfo->rmode(); if (target_page->IsEvacuationCandidate() && (rinfo->host() == NULL || !ShouldSkipEvacuationSlotRecording(rinfo->host()))) { - RelocInfo::Mode rmode = rinfo->rmode(); Address addr = rinfo->pc(); - SlotType slot_type = SlotTypeForRelocInfoMode(rmode); + SlotType slot_type = SlotTypeForRMode(rmode); if (rinfo->IsInConstantPool()) { addr = rinfo->constant_pool_entry_address(); if (RelocInfo::IsCodeTarget(rmode)) { @@ -3472,12 +3447,6 @@ int MarkCompactCollector::Sweeper::RawSweep(PagedSpace* space, Page* p, } void MarkCompactCollector::InvalidateCode(Code* code) { - Page* page = Page::FromAddress(code->address()); - Address start = code->instruction_start(); - Address end = code->address() + code->Size(); - - RememberedSet::RemoveRangeTyped(page, start, end); - if (heap_->incremental_marking()->IsCompacting() && !ShouldSkipEvacuationSlotRecording(code)) { DCHECK(compacting_); @@ -3489,7 +3458,11 @@ void MarkCompactCollector::InvalidateCode(Code* code) { // Ignore all slots that might have been recorded in the body of the // deoptimized code object. Assumption: no slots will be recorded for // this object after invalidating it. + Page* page = Page::FromAddress(code->address()); + Address start = code->instruction_start(); + Address end = code->address() + code->Size(); RememberedSet::RemoveRangeTyped(page, start, end); + RememberedSet::RemoveRangeTyped(page, start, end); } } @@ -4090,9 +4063,6 @@ void MarkCompactCollector::RecordCodeTargetPatch(Address pc, Code* target) { MarkBit mark_bit = Marking::MarkBitFrom(host); if (Marking::IsBlack(mark_bit)) { RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); - // The target is always in old space, we don't have to record the slot in - // the old-to-new remembered set. - DCHECK(!heap()->InNewSpace(target)); RecordRelocSlot(host, &rinfo, target); } } diff --git a/src/heap/remembered-set.cc b/src/heap/remembered-set.cc index 6e27c288cf..0bc5e6e324 100644 --- a/src/heap/remembered-set.cc +++ b/src/heap/remembered-set.cc @@ -9,7 +9,6 @@ #include "src/heap/slot-set.h" #include "src/heap/spaces.h" #include "src/heap/store-buffer.h" -#include "src/macro-assembler.h" namespace v8 { namespace internal { @@ -26,19 +25,6 @@ void RememberedSet::ClearInvalidSlots(Heap* heap) { }); } } - for (MemoryChunk* chunk : *heap->code_space()) { - TypedSlotSet* slots = GetTypedSlotSet(chunk); - if (slots != nullptr) { - slots->Iterate( - [heap, chunk](SlotType type, Address host_addr, Address addr) { - if (Marking::IsBlack(Marking::MarkBitFrom(host_addr))) { - return KEEP_SLOT; - } else { - return REMOVE_SLOT; - } - }); - } - } } template diff --git a/src/heap/remembered-set.h b/src/heap/remembered-set.h index ab5badf5cd..339748cbd7 100644 --- a/src/heap/remembered-set.h +++ b/src/heap/remembered-set.h @@ -345,20 +345,6 @@ class UpdateTypedSlotHelper { } }; -inline SlotType SlotTypeForRelocInfoMode(RelocInfo::Mode rmode) { - if (RelocInfo::IsCodeTarget(rmode)) { - return CODE_TARGET_SLOT; - } else if (RelocInfo::IsCell(rmode)) { - return CELL_TARGET_SLOT; - } else if (RelocInfo::IsEmbeddedObject(rmode)) { - return EMBEDDED_OBJECT_SLOT; - } else if (RelocInfo::IsDebugBreakSlot(rmode)) { - return DEBUG_TARGET_SLOT; - } - UNREACHABLE(); - return NUMBER_OF_SLOT_TYPES; -} - } // namespace internal } // namespace v8 diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h index e72b4072c4..2120a90e0c 100644 --- a/src/ia32/assembler-ia32-inl.h +++ b/src/ia32/assembler-ia32-inl.h @@ -137,7 +137,8 @@ void RelocInfo::set_target_object(Object* target, if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && target->IsHeapObject()) { - host()->GetHeap()->RecordWriteIntoCode(host(), this, target); + host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( + host(), this, HeapObject::cast(target)); } } @@ -340,6 +341,7 @@ Immediate::Immediate(Handle 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(handle.location()); rmode_ = RelocInfo::EMBEDDED_OBJECT; } else { @@ -378,6 +380,7 @@ void Assembler::emit(Handle 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(handle.location()), RelocInfo::EMBEDDED_OBJECT); diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index 33044bac73..25a0a95974 100644 --- a/src/ia32/macro-assembler-ia32.cc +++ b/src/ia32/macro-assembler-ia32.cc @@ -2595,15 +2595,37 @@ int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { void MacroAssembler::LoadHeapObject(Register result, Handle object) { - mov(result, object); + AllowDeferredHandleDereference embedding_raw_address; + if (isolate()->heap()->InNewSpace(*object)) { + Handle cell = isolate()->factory()->NewCell(object); + mov(result, Operand::ForCell(cell)); + } else { + mov(result, object); + } } void MacroAssembler::CmpHeapObject(Register reg, Handle object) { - cmp(reg, object); + AllowDeferredHandleDereference using_raw_address; + if (isolate()->heap()->InNewSpace(*object)) { + Handle cell = isolate()->factory()->NewCell(object); + cmp(reg, Operand::ForCell(cell)); + } else { + cmp(reg, object); + } +} + + +void MacroAssembler::PushHeapObject(Handle object) { + AllowDeferredHandleDereference using_raw_address; + if (isolate()->heap()->InNewSpace(*object)) { + Handle cell = isolate()->factory()->NewCell(object); + push(Operand::ForCell(cell)); + } else { + Push(object); + } } -void MacroAssembler::PushHeapObject(Handle object) { Push(object); } void MacroAssembler::CmpWeakValue(Register value, Handle cell, Register scratch) { diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h index 0dfde0f268..57aea3898c 100644 --- a/src/mips/assembler-mips-inl.h +++ b/src/mips/assembler-mips-inl.h @@ -225,7 +225,6 @@ void RelocInfo::set_target_object(Object* target, target->IsHeapObject()) { host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host(), this, HeapObject::cast(target)); - host()->GetHeap()->RecordWriteIntoCode(host(), this, target); } } diff --git a/src/mips/assembler-mips.cc b/src/mips/assembler-mips.cc index 402dfc8e13..381de5d0e8 100644 --- a/src/mips/assembler-mips.cc +++ b/src/mips/assembler-mips.cc @@ -225,6 +225,7 @@ Operand::Operand(Handle 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)); imm32_ = reinterpret_cast(handle.location()); rmode_ = RelocInfo::EMBEDDED_OBJECT; } else { diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index 903ed63243..a07ebd5b43 100644 --- a/src/mips/macro-assembler-mips.cc +++ b/src/mips/macro-assembler-mips.cc @@ -1402,7 +1402,19 @@ void MacroAssembler::Usdc1(FPURegister fd, const MemOperand& rs, void MacroAssembler::li(Register dst, Handle value, LiFlags mode) { - li(dst, Operand(value), mode); + AllowDeferredHandleDereference smi_check; + if (value->IsSmi()) { + li(dst, Operand(value), mode); + } else { + DCHECK(value->IsHeapObject()); + if (isolate()->heap()->InNewSpace(*value)) { + Handle cell = isolate()->factory()->NewCell(value); + li(dst, Operand(cell)); + lw(dst, FieldMemOperand(dst, Cell::kValueOffset)); + } else { + li(dst, Operand(value)); + } + } } diff --git a/src/mips64/assembler-mips64-inl.h b/src/mips64/assembler-mips64-inl.h index 8190655a86..82267edd0a 100644 --- a/src/mips64/assembler-mips64-inl.h +++ b/src/mips64/assembler-mips64-inl.h @@ -213,7 +213,6 @@ void RelocInfo::set_target_object(Object* target, target->IsHeapObject()) { host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host(), this, HeapObject::cast(target)); - host()->GetHeap()->RecordWriteIntoCode(host(), this, target); } } diff --git a/src/mips64/assembler-mips64.cc b/src/mips64/assembler-mips64.cc index 1eb312f8ca..bd4e3e225f 100644 --- a/src/mips64/assembler-mips64.cc +++ b/src/mips64/assembler-mips64.cc @@ -204,6 +204,7 @@ Operand::Operand(Handle 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)); imm64_ = reinterpret_cast(handle.location()); rmode_ = RelocInfo::EMBEDDED_OBJECT; } else { diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc index f238c52427..c5ca43bae5 100644 --- a/src/mips64/macro-assembler-mips64.cc +++ b/src/mips64/macro-assembler-mips64.cc @@ -1595,7 +1595,19 @@ void MacroAssembler::Usdc1(FPURegister fd, const MemOperand& rs, } void MacroAssembler::li(Register dst, Handle value, LiFlags mode) { - li(dst, Operand(value), mode); + AllowDeferredHandleDereference smi_check; + if (value->IsSmi()) { + li(dst, Operand(value), mode); + } else { + DCHECK(value->IsHeapObject()); + if (isolate()->heap()->InNewSpace(*value)) { + Handle cell = isolate()->factory()->NewCell(value); + li(dst, Operand(cell)); + ld(dst, FieldMemOperand(dst, Cell::kValueOffset)); + } else { + li(dst, Operand(value)); + } + } } static inline int64_t ShiftAndFixSignExtension(int64_t imm, int bitnum) { diff --git a/src/objects-debug.cc b/src/objects-debug.cc index 63ec18751c..374682acff 100644 --- a/src/objects-debug.cc +++ b/src/objects-debug.cc @@ -703,25 +703,11 @@ void Code::VerifyEmbeddedObjectsDependency() { CHECK(map->dependent_code()->Contains(DependentCode::kWeakCodeGroup, cell)); } else if (obj->IsJSObject()) { - if (isolate->heap()->InNewSpace(obj)) { - ArrayList* list = - GetIsolate()->heap()->weak_new_space_object_to_code_list(); - bool found = false; - for (int i = 0; i < list->Length(); i += 2) { - WeakCell* obj_cell = WeakCell::cast(list->Get(i)); - if (!obj_cell->cleared() && obj_cell->value() == obj && - WeakCell::cast(list->Get(i + 1)) == cell) { - found = true; - break; - } - } - CHECK(found); - } else { - Handle key_obj(HeapObject::cast(obj), isolate); - DependentCode* dep = - GetIsolate()->heap()->LookupWeakObjectToCodeDependency(key_obj); - dep->Contains(DependentCode::kWeakCodeGroup, cell); - } + WeakHashTable* table = + GetIsolate()->heap()->weak_object_to_code_table(); + Handle key_obj(HeapObject::cast(obj), isolate); + CHECK(DependentCode::cast(table->Lookup(key_obj)) + ->Contains(DependentCode::kWeakCodeGroup, cell)); } } } diff --git a/src/objects-inl.h b/src/objects-inl.h index 23c9aab9e3..6fff393f68 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -2467,8 +2467,9 @@ Object** ArrayList::Slot(int index) { return data_start() + kFirstIndex + index; } -void ArrayList::Set(int index, Object* obj, WriteBarrierMode mode) { - FixedArray::cast(this)->set(kFirstIndex + index, obj, mode); + +void ArrayList::Set(int index, Object* obj) { + FixedArray::cast(this)->set(kFirstIndex + index, obj); } diff --git a/src/objects.h b/src/objects.h index e9d40b06e6..680677d43f 100644 --- a/src/objects.h +++ b/src/objects.h @@ -2857,8 +2857,7 @@ class ArrayList : public FixedArray { inline void SetLength(int length); inline Object* Get(int index); inline Object** Slot(int index); - inline void Set(int index, Object* obj, - WriteBarrierMode mode = UPDATE_WRITE_BARRIER); + inline void Set(int index, Object* obj); inline void Clear(int index, Object* undefined); bool IsFull(); DECLARE_CAST(ArrayList) diff --git a/src/x64/assembler-x64-inl.h b/src/x64/assembler-x64-inl.h index a7256565f1..60acacd3bb 100644 --- a/src/x64/assembler-x64-inl.h +++ b/src/x64/assembler-x64-inl.h @@ -410,7 +410,6 @@ void RelocInfo::set_target_object(Object* target, target->IsHeapObject()) { host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host(), this, HeapObject::cast(target)); - host()->GetHeap()->RecordWriteIntoCode(host(), this, target); } } diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index 852e078860..d095b3ae9b 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -2966,8 +2966,15 @@ void MacroAssembler::Push(Handle source) { void MacroAssembler::MoveHeapObject(Register result, Handle object) { + AllowDeferredHandleDereference using_raw_address; DCHECK(object->IsHeapObject()); - Move(result, object, RelocInfo::EMBEDDED_OBJECT); + if (isolate()->heap()->InNewSpace(*object)) { + Handle cell = isolate()->factory()->NewCell(object); + Move(result, cell, RelocInfo::CELL); + movp(result, Operand(result, 0)); + } else { + Move(result, object, RelocInfo::EMBEDDED_OBJECT); + } } diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h index 887f4314f7..b088c7d19c 100644 --- a/src/x64/macro-assembler-x64.h +++ b/src/x64/macro-assembler-x64.h @@ -927,6 +927,7 @@ class MacroAssembler: public Assembler { AllowDeferredHandleDereference using_raw_address; DCHECK(!RelocInfo::IsNone(rmode)); DCHECK(value->IsHeapObject()); + DCHECK(!isolate()->heap()->InNewSpace(*value)); movp(dst, reinterpret_cast(value.location()), rmode); } diff --git a/src/x87/assembler-x87-inl.h b/src/x87/assembler-x87-inl.h index 779feeb907..ba2a86405e 100644 --- a/src/x87/assembler-x87-inl.h +++ b/src/x87/assembler-x87-inl.h @@ -140,7 +140,6 @@ void RelocInfo::set_target_object(Object* target, target->IsHeapObject()) { host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( host(), this, HeapObject::cast(target)); - host()->GetHeap()->RecordWriteIntoCode(host(), this, target); } } diff --git a/test/cctest/heap/test-heap.cc b/test/cctest/heap/test-heap.cc index ab7ae8ac3b..524a553a15 100644 --- a/test/cctest/heap/test-heap.cc +++ b/test/cctest/heap/test-heap.cc @@ -4817,67 +4817,6 @@ TEST(ObjectsInOptimizedCodeAreWeak) { CHECK(code->marked_for_deoptimization()); } -TEST(NewSpaceObjectsInOptimizedCode) { - if (i::FLAG_always_opt || !i::FLAG_crankshaft || i::FLAG_turbo) return; - i::FLAG_weak_embedded_objects_in_optimized_code = true; - i::FLAG_allow_natives_syntax = true; - CcTest::InitializeVM(); - Isolate* isolate = CcTest::i_isolate(); - v8::internal::Heap* heap = CcTest::heap(); - - if (!isolate->use_crankshaft()) return; - HandleScope outer_scope(heap->isolate()); - Handle code; - { - LocalContext context; - HandleScope scope(heap->isolate()); - - CompileRun( - "var foo;" - "var bar;" - "(function() {" - " function foo_func(x) { with (x) { return 1 + x; } };" - " %NeverOptimizeFunction(foo_func);" - " function bar_func() {" - " return foo(1);" - " };" - " bar = bar_func;" - " foo = foo_func;" - " bar_func();" - " bar_func();" - " bar_func();" - " %OptimizeFunctionOnNextCall(bar_func);" - " bar_func();" - "})();"); - - Handle bar = Handle::cast(v8::Utils::OpenHandle( - *v8::Local::Cast(CcTest::global() - ->Get(context.local(), v8_str("bar")) - .ToLocalChecked()))); - - Handle foo = Handle::cast(v8::Utils::OpenHandle( - *v8::Local::Cast(CcTest::global() - ->Get(context.local(), v8_str("foo")) - .ToLocalChecked()))); - - CHECK(heap->InNewSpace(*foo)); - heap->CollectGarbage(NEW_SPACE); - heap->CollectGarbage(NEW_SPACE); - CHECK(!heap->InNewSpace(*foo)); -#ifdef VERIFY_HEAP - heap->Verify(); -#endif - CHECK(!bar->code()->marked_for_deoptimization()); - code = scope.CloseAndEscape(Handle(bar->code())); - } - - // Now make sure that a gc should get rid of the function - for (int i = 0; i < 4; i++) { - heap->CollectAllGarbage(); - } - - CHECK(code->marked_for_deoptimization()); -} TEST(NoWeakHashTableLeakWithIncrementalMarking) { if (i::FLAG_always_opt || !i::FLAG_crankshaft) return; diff --git a/test/cctest/test-serialize.cc b/test/cctest/test-serialize.cc index 8fcebbd77f..de36877dfa 100644 --- a/test/cctest/test-serialize.cc +++ b/test/cctest/test-serialize.cc @@ -1852,19 +1852,15 @@ TEST(CodeSerializerCell) { assembler.enable_serializer(); Handle number = isolate->factory()->NewHeapNumber(0.3); CHECK(isolate->heap()->InNewSpace(*number)); - Handle code; - { - MacroAssembler* masm = &assembler; - Handle cell = isolate->factory()->NewCell(number); - masm->Move(rax, cell, RelocInfo::CELL); - masm->movp(rax, Operand(rax, 0)); - masm->ret(0); - CodeDesc desc; - masm->GetCode(&desc); - code = isolate->factory()->NewCode(desc, Code::ComputeFlags(Code::FUNCTION), - masm->CodeObject()); - code->set_has_reloc_info_for_serialization(true); - } + MacroAssembler* masm = &assembler; + masm->MoveHeapObject(rax, number); + masm->ret(0); + CodeDesc desc; + masm->GetCode(&desc); + Handle code = isolate->factory()->NewCode( + desc, Code::ComputeFlags(Code::FUNCTION), masm->CodeObject()); + code->set_has_reloc_info_for_serialization(true); + RelocIterator rit1(*code, 1 << RelocInfo::CELL); CHECK_EQ(*number, rit1.rinfo()->target_cell()->value());