Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/heap/mark-compact.cc

Issue 2025833002: [heap] Store the host address in the typed remembered set. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/remembered-set.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/heap/mark-compact.h" 5 #include "src/heap/mark-compact.h"
6 6
7 #include "src/base/atomicops.h" 7 #include "src/base/atomicops.h"
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/base/sys-info.h" 9 #include "src/base/sys-info.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1535 matching lines...) Expand 10 before | Expand all | Expand 10 after
1546 while (start < end) { 1546 while (start < end) {
1547 RecordMigratedSlot(*start, reinterpret_cast<Address>(start)); 1547 RecordMigratedSlot(*start, reinterpret_cast<Address>(start));
1548 ++start; 1548 ++start;
1549 } 1549 }
1550 } 1550 }
1551 1551
1552 inline void VisitCodeEntry(Address code_entry_slot) final { 1552 inline void VisitCodeEntry(Address code_entry_slot) final {
1553 Address code_entry = Memory::Address_at(code_entry_slot); 1553 Address code_entry = Memory::Address_at(code_entry_slot);
1554 if (Page::FromAddress(code_entry)->IsEvacuationCandidate()) { 1554 if (Page::FromAddress(code_entry)->IsEvacuationCandidate()) {
1555 RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(code_entry_slot), 1555 RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(code_entry_slot),
1556 CODE_ENTRY_SLOT, code_entry_slot); 1556 nullptr, CODE_ENTRY_SLOT,
1557 code_entry_slot);
1557 } 1558 }
1558 } 1559 }
1559 1560
1560 inline void VisitCodeTarget(RelocInfo* rinfo) final { 1561 inline void VisitCodeTarget(RelocInfo* rinfo) final {
1561 DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode())); 1562 DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode()));
1562 Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); 1563 Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
1563 Code* host = rinfo->host(); 1564 Code* host = rinfo->host();
1564 collector_->RecordRelocSlot(host, rinfo, target); 1565 collector_->RecordRelocSlot(host, rinfo, target);
1565 } 1566 }
1566 1567
(...skipping 1250 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 SlotType slot_type = SlotTypeForRMode(rmode); 2818 SlotType slot_type = SlotTypeForRMode(rmode);
2818 if (rinfo->IsInConstantPool()) { 2819 if (rinfo->IsInConstantPool()) {
2819 addr = rinfo->constant_pool_entry_address(); 2820 addr = rinfo->constant_pool_entry_address();
2820 if (RelocInfo::IsCodeTarget(rmode)) { 2821 if (RelocInfo::IsCodeTarget(rmode)) {
2821 slot_type = CODE_ENTRY_SLOT; 2822 slot_type = CODE_ENTRY_SLOT;
2822 } else { 2823 } else {
2823 DCHECK(RelocInfo::IsEmbeddedObject(rmode)); 2824 DCHECK(RelocInfo::IsEmbeddedObject(rmode));
2824 slot_type = OBJECT_SLOT; 2825 slot_type = OBJECT_SLOT;
2825 } 2826 }
2826 } 2827 }
2827 RememberedSet<OLD_TO_OLD>::InsertTyped(source_page, slot_type, addr); 2828 RememberedSet<OLD_TO_OLD>::InsertTyped(
2829 source_page, reinterpret_cast<Address>(host), slot_type, addr);
2828 } 2830 }
2829 } 2831 }
2830 2832
2831 static inline SlotCallbackResult UpdateSlot(Object** slot) { 2833 static inline SlotCallbackResult UpdateSlot(Object** slot) {
2832 Object* obj = reinterpret_cast<Object*>( 2834 Object* obj = reinterpret_cast<Object*>(
2833 base::NoBarrier_Load(reinterpret_cast<base::AtomicWord*>(slot))); 2835 base::NoBarrier_Load(reinterpret_cast<base::AtomicWord*>(slot)));
2834 2836
2835 if (obj->IsHeapObject()) { 2837 if (obj->IsHeapObject()) {
2836 HeapObject* heap_obj = HeapObject::cast(obj); 2838 HeapObject* heap_obj = HeapObject::cast(obj);
2837 MapWord map_word = heap_obj->map_word(); 2839 MapWord map_word = heap_obj->map_word();
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after
3598 RememberedSet<OLD_TO_OLD>::Iterate(chunk, [](Address slot) { 3600 RememberedSet<OLD_TO_OLD>::Iterate(chunk, [](Address slot) {
3599 return UpdateSlot(reinterpret_cast<Object**>(slot)); 3601 return UpdateSlot(reinterpret_cast<Object**>(slot));
3600 }); 3602 });
3601 } 3603 }
3602 } 3604 }
3603 3605
3604 static void UpdateTypedPointers(Heap* heap, MemoryChunk* chunk) { 3606 static void UpdateTypedPointers(Heap* heap, MemoryChunk* chunk) {
3605 if (direction == OLD_TO_OLD) { 3607 if (direction == OLD_TO_OLD) {
3606 Isolate* isolate = heap->isolate(); 3608 Isolate* isolate = heap->isolate();
3607 RememberedSet<OLD_TO_OLD>::IterateTyped( 3609 RememberedSet<OLD_TO_OLD>::IterateTyped(
3608 chunk, [isolate](SlotType type, Address slot) { 3610 chunk, [isolate](SlotType type, Address host_addr, Address slot) {
3609 return UpdateTypedSlotHelper::UpdateTypedSlot(isolate, type, slot, 3611 return UpdateTypedSlotHelper::UpdateTypedSlot(isolate, type, slot,
3610 UpdateSlot); 3612 UpdateSlot);
3611 }); 3613 });
3612 } else { 3614 } else {
3613 Isolate* isolate = heap->isolate(); 3615 Isolate* isolate = heap->isolate();
3614 RememberedSet<OLD_TO_NEW>::IterateTyped( 3616 RememberedSet<OLD_TO_NEW>::IterateTyped(
3615 chunk, [isolate, heap](SlotType type, Address slot) { 3617 chunk,
3618 [isolate, heap](SlotType type, Address host_addr, Address slot) {
3616 return UpdateTypedSlotHelper::UpdateTypedSlot( 3619 return UpdateTypedSlotHelper::UpdateTypedSlot(
3617 isolate, type, slot, [heap](Object** slot) { 3620 isolate, type, slot, [heap](Object** slot) {
3618 return CheckAndUpdateOldToNewSlot( 3621 return CheckAndUpdateOldToNewSlot(
3619 heap, reinterpret_cast<Address>(slot)); 3622 heap, reinterpret_cast<Address>(slot));
3620 }); 3623 });
3621 }); 3624 });
3622 } 3625 }
3623 } 3626 }
3624 3627
3625 static SlotCallbackResult CheckAndUpdateOldToNewSlot(Heap* heap, 3628 static SlotCallbackResult CheckAndUpdateOldToNewSlot(Heap* heap,
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
3960 } 3963 }
3961 3964
3962 void MarkCompactCollector::RecordCodeEntrySlot(HeapObject* host, Address slot, 3965 void MarkCompactCollector::RecordCodeEntrySlot(HeapObject* host, Address slot,
3963 Code* target) { 3966 Code* target) {
3964 Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); 3967 Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target));
3965 Page* source_page = Page::FromAddress(reinterpret_cast<Address>(host)); 3968 Page* source_page = Page::FromAddress(reinterpret_cast<Address>(host));
3966 if (target_page->IsEvacuationCandidate() && 3969 if (target_page->IsEvacuationCandidate() &&
3967 !ShouldSkipEvacuationSlotRecording(host)) { 3970 !ShouldSkipEvacuationSlotRecording(host)) {
3968 // TODO(ulan): remove this check after investigating crbug.com/414964. 3971 // TODO(ulan): remove this check after investigating crbug.com/414964.
3969 CHECK(target->IsCode()); 3972 CHECK(target->IsCode());
3970 RememberedSet<OLD_TO_OLD>::InsertTyped(source_page, CODE_ENTRY_SLOT, slot); 3973 RememberedSet<OLD_TO_OLD>::InsertTyped(
3974 source_page, reinterpret_cast<Address>(host), CODE_ENTRY_SLOT, slot);
3971 } 3975 }
3972 } 3976 }
3973 3977
3974 3978
3975 void MarkCompactCollector::RecordCodeTargetPatch(Address pc, Code* target) { 3979 void MarkCompactCollector::RecordCodeTargetPatch(Address pc, Code* target) {
3976 DCHECK(heap()->gc_state() == Heap::MARK_COMPACT); 3980 DCHECK(heap()->gc_state() == Heap::MARK_COMPACT);
3977 if (is_compacting()) { 3981 if (is_compacting()) {
3978 Code* host = 3982 Code* host =
3979 isolate()->inner_pointer_to_code_cache()->GcSafeFindCodeForInnerPointer( 3983 isolate()->inner_pointer_to_code_cache()->GcSafeFindCodeForInnerPointer(
3980 pc); 3984 pc);
3981 MarkBit mark_bit = Marking::MarkBitFrom(host); 3985 MarkBit mark_bit = Marking::MarkBitFrom(host);
3982 if (Marking::IsBlack(mark_bit)) { 3986 if (Marking::IsBlack(mark_bit)) {
3983 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); 3987 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host);
3984 RecordRelocSlot(host, &rinfo, target); 3988 RecordRelocSlot(host, &rinfo, target);
3985 } 3989 }
3986 } 3990 }
3987 } 3991 }
3988 3992
3989 } // namespace internal 3993 } // namespace internal
3990 } // namespace v8 3994 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/remembered-set.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698