Skip to content

Commit 06bf293

Browse files
LeszekSwirskiV8 LUCI CQ
authored andcommitted
[tagged] Make FreeSpace a HeapObjectLayout
Bug: 42202654 Change-Id: I2c5d1a69d9bf0272b631e3fa7964026f3ccded11 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6596552 Reviewed-by: Michael Lippautz <[email protected]> Auto-Submit: Leszek Swirski <[email protected]> Commit-Queue: Michael Lippautz <[email protected]> Cr-Commit-Position: refs/heads/main@{#100564}
1 parent 6b46e33 commit 06bf293

18 files changed

Lines changed: 63 additions & 49 deletions

src/builtins/base.tq

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ type Zero extends PositiveSmi;
5858
// A tagged value represented by an all-zero bitpattern.
5959
type TaggedZeroPattern extends TaggedIndex;
6060

61-
// A value with the size of Tagged which may contain arbitrary data.
62-
type Uninitialized extends Tagged;
63-
6461
type BuiltinsName extends int31 constexpr 'Builtin';
6562

6663
type UseCounterFeature extends int31

src/compiler/access-builder.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ FieldAccess AccessBuilder::ForNameRawHashField() {
914914

915915
// static
916916
FieldAccess AccessBuilder::ForFreeSpaceSize() {
917-
FieldAccess access = {kTaggedBase, FreeSpace::kSizeOffset,
917+
FieldAccess access = {kTaggedBase, offsetof(FreeSpace, size_),
918918
MaybeHandle<Name>(), OptionalMapRef(),
919919
Type::SignedSmall(), MachineType::TaggedSigned(),
920920
kNoWriteBarrier};

src/diagnostics/objects-debug.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,10 @@ void HeapObject::HeapObjectVerify(Isolate* isolate) {
349349
Cast<BigIntBase>(*this)->BigIntBaseVerify(isolate);
350350
break;
351351

352+
case FREE_SPACE_TYPE:
353+
Cast<FreeSpace>(*this)->FreeSpaceVerify(isolate);
354+
break;
355+
352356
case JS_CLASS_CONSTRUCTOR_TYPE:
353357
case JS_PROMISE_CONSTRUCTOR_TYPE:
354358
case JS_REG_EXP_CONSTRUCTOR_TYPE:
@@ -381,6 +385,14 @@ void HeapObject::VerifyCodePointer(Isolate* isolate, Tagged<Object> p) {
381385
CHECK(IsInstructionStream(Cast<HeapObject>(p), cage_base));
382386
}
383387

388+
void FreeSpace::FreeSpaceVerify(Isolate* isolate) {
389+
CHECK(IsFreeSpace(this));
390+
{
391+
Tagged<Object> size = size_.Relaxed_Load();
392+
CHECK(IsSmi(size));
393+
}
394+
}
395+
384396
void Name::NameVerify(Isolate* isolate) {
385397
PrimitiveHeapObjectVerify(isolate);
386398
CHECK(IsName(this));

src/diagnostics/objects-printer.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,9 @@ void HeapObject::HeapObjectPrint(std::ostream& os) {
395395
case BIG_INT_BASE_TYPE:
396396
Cast<BigIntBase>(*this)->BigIntBasePrint(os);
397397
break;
398+
case FREE_SPACE_TYPE:
399+
Cast<FreeSpace>(*this)->FreeSpacePrint(os);
400+
break;
398401
case JS_CLASS_CONSTRUCTOR_TYPE:
399402
case JS_PROMISE_CONSTRUCTOR_TYPE:
400403
case JS_REG_EXP_CONSTRUCTOR_TYPE:

src/heap/free-list.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void FreeListCategory::Unlink(FreeList* owner) {
2828

2929
void FreeListCategory::Reset(FreeList* owner) {
3030
Unlink(owner);
31-
set_top(FreeSpace());
31+
set_top(Tagged<FreeSpace>());
3232
available_ = 0;
3333
}
3434

@@ -39,7 +39,7 @@ Tagged<FreeSpace> FreeListCategory::PickNodeFromList(size_t minimum_size,
3939
DCHECK(MemoryChunk::FromHeapObject(node)->CanAllocate());
4040
if (static_cast<size_t>(node->Size()) < minimum_size) {
4141
*node_size = 0;
42-
return FreeSpace();
42+
return Tagged<FreeSpace>();
4343
}
4444
set_top(node->next());
4545
*node_size = node->Size();
@@ -80,7 +80,7 @@ Tagged<FreeSpace> FreeListCategory::SearchForNodeInList(size_t minimum_size,
8080

8181
prev_non_evac_node = cur_node;
8282
}
83-
return FreeSpace();
83+
return Tagged<FreeSpace>();
8484
}
8585

8686
void FreeListCategory::Free(const WritableFreeSpace& writable_free_space,
@@ -140,7 +140,7 @@ Tagged<FreeSpace> FreeList::TryFindNodeIn(FreeListCategoryType type,
140140
size_t minimum_size,
141141
size_t* node_size) {
142142
FreeListCategory* category = categories_[type];
143-
if (category == nullptr) return FreeSpace();
143+
if (category == nullptr) return Tagged<FreeSpace>();
144144
Tagged<FreeSpace> node = category->PickNodeFromList(minimum_size, node_size);
145145
if (!node.is_null()) {
146146
DecreaseAvailableBytes(*node_size);

src/heap/heap.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6326,13 +6326,14 @@ void Heap::TearDown() {
63266326
}
63276327

63286328
// static
6329-
bool Heap::IsFreeSpaceValid(FreeSpace object) {
6329+
bool Heap::IsFreeSpaceValid(const FreeSpace* object) {
63306330
Heap* heap = HeapUtils::GetOwnerHeap(object);
63316331
Tagged<Object> free_space_map =
63326332
heap->isolate()->root(RootIndex::kFreeSpaceMap);
63336333
CHECK(!heap->deserialization_complete() ||
6334-
object.map_slot().contains_map_value(free_space_map.ptr()));
6335-
CHECK_LE(FreeSpace::kNextOffset + kTaggedSize, object.size(kRelaxedLoad));
6334+
object->map_slot().contains_map_value(free_space_map.ptr()));
6335+
CHECK_LE(offsetof(FreeSpace, next_) + kTaggedSize,
6336+
object->size(kRelaxedLoad));
63366337
return true;
63376338
}
63386339

src/heap/heap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ class Heap final {
365365
collector == GarbageCollector::MINOR_MARK_SWEEPER;
366366
}
367367

368-
V8_EXPORT_PRIVATE static bool IsFreeSpaceValid(FreeSpace object);
368+
V8_EXPORT_PRIVATE static bool IsFreeSpaceValid(const FreeSpace* object);
369369

370370
static inline GarbageCollector YoungGenerationCollector() {
371371
return (v8_flags.minor_ms) ? GarbageCollector::MINOR_MARK_SWEEPER

src/heap/sweeper.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,11 +1026,11 @@ std::optional<base::AddressRegion> Sweeper::ComputeDiscardMemoryArea(
10261026

10271027
void Sweeper::ZeroOrDiscardUnusedMemory(PageMetadata* page, Address addr,
10281028
size_t size) {
1029-
if (size < FreeSpace::kSize) {
1029+
if (size < sizeof(FreeSpace)) {
10301030
return;
10311031
}
10321032

1033-
const Address unused_start = addr + FreeSpace::kSize;
1033+
const Address unused_start = addr + sizeof(FreeSpace);
10341034
DCHECK(page->ContainsLimit(unused_start));
10351035
const Address unused_end = addr + size;
10361036
DCHECK(page->ContainsLimit(unused_end));

src/objects/free-space-inl.h

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,30 @@
1919
namespace v8 {
2020
namespace internal {
2121

22-
#include "torque-generated/src/objects/free-space-tq-inl.inc"
23-
24-
TQ_OBJECT_CONSTRUCTORS_IMPL(FreeSpace)
25-
26-
RELAXED_SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
22+
int FreeSpace::size(RelaxedLoadTag) const {
23+
return size_.Relaxed_Load().value();
24+
}
2725

2826
// static
2927
inline void FreeSpace::SetSize(const WritableFreeSpace& writable_free_space,
3028
int size, RelaxedStoreTag tag) {
31-
writable_free_space.WriteHeaderSlot<Smi, kSizeOffset>(Smi::FromInt(size),
32-
tag);
29+
writable_free_space.WriteHeaderSlot<Smi, offsetof(FreeSpace, size_)>(
30+
Smi::FromInt(size), tag);
3331
}
3432

3533
int FreeSpace::Size() { return size(kRelaxedLoad); }
3634

3735
Tagged<FreeSpace> FreeSpace::next() const {
3836
DCHECK(IsValid());
3937
#ifdef V8_EXTERNAL_CODE_SPACE
40-
intptr_t diff_to_next =
41-
static_cast<intptr_t>(TaggedField<Smi, kNextOffset>::load(*this).value());
38+
intptr_t diff_to_next{next_.Relaxed_Load().value()};
4239
if (diff_to_next == 0) {
43-
return FreeSpace();
40+
return {};
4441
}
4542
Address next_ptr = ptr() + diff_to_next * kObjectAlignment;
4643
return UncheckedCast<FreeSpace>(Tagged<Object>(next_ptr));
4744
#else
48-
return UncheckedCast<FreeSpace>(
49-
TaggedField<Object, kNextOffset>::load(*this));
45+
return next_.Relaxed_Load();
5046
#endif // V8_EXTERNAL_CODE_SPACE
5147
}
5248

@@ -56,20 +52,21 @@ void FreeSpace::SetNext(const WritableFreeSpace& writable_free_space,
5652

5753
#ifdef V8_EXTERNAL_CODE_SPACE
5854
if (next.is_null()) {
59-
writable_free_space.WriteHeaderSlot<Smi, kNextOffset>(Smi::zero(),
60-
kRelaxedStore);
55+
writable_free_space.WriteHeaderSlot<Smi, offsetof(FreeSpace, next_)>(
56+
Smi::zero(), kRelaxedStore);
6157
return;
6258
}
6359
intptr_t diff_to_next = next.ptr() - ptr();
6460
DCHECK(IsAligned(diff_to_next, kObjectAlignment));
65-
writable_free_space.WriteHeaderSlot<Smi, kNextOffset>(
61+
writable_free_space.WriteHeaderSlot<Smi, offsetof(FreeSpace, next_)>(
6662
Smi::FromIntptr(diff_to_next / kObjectAlignment), kRelaxedStore);
6763
#else
68-
writable_free_space.WriteHeaderSlot<Object, kNextOffset>(next, kRelaxedStore);
64+
writable_free_space.WriteHeaderSlot<Object, offsetof(FreeSpace, next_)>(
65+
next, kRelaxedStore);
6966
#endif // V8_EXTERNAL_CODE_SPACE
7067
}
7168

72-
bool FreeSpace::IsValid() const { return Heap::IsFreeSpaceValid(*this); }
69+
bool FreeSpace::IsValid() const { return Heap::IsFreeSpaceValid(this); }
7370

7471
} // namespace internal
7572
} // namespace v8

src/objects/free-space.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@
99

1010
// Has to be the last include (doesn't have include guards):
1111
#include "src/objects/object-macros.h"
12+
#include "src/objects/tagged-field.h"
1213

1314
namespace v8 {
1415
namespace internal {
1516

16-
#include "torque-generated/src/objects/free-space-tq.inc"
17-
1817
// FreeSpace are fixed-size free memory blocks used by the heap and GC.
1918
// They look like heap objects (are heap object tagged and have a map) so that
2019
// the heap remains iterable. They have a size and a next pointer.
@@ -30,10 +29,11 @@ namespace internal {
3029
// 31 bits),
3130
// b) it's independent of the pointer compression base and pointer compression
3231
// scheme.
33-
class FreeSpace : public TorqueGeneratedFreeSpace<FreeSpace, HeapObject> {
32+
class FreeSpace : public HeapObjectLayout {
3433
public:
3534
// [size]: size of the free space including the header.
36-
DECL_RELAXED_INT_ACCESSORS(size)
35+
inline int size(RelaxedLoadTag) const;
36+
3737
static inline void SetSize(const WritableFreeSpace& writable_free_space,
3838
int size, RelaxedStoreTag);
3939
inline int Size();
@@ -45,13 +45,22 @@ class FreeSpace : public TorqueGeneratedFreeSpace<FreeSpace, HeapObject> {
4545

4646
// Dispatched behavior.
4747
DECL_PRINTER(FreeSpace)
48+
DECL_VERIFIER(FreeSpace)
4849

4950
class BodyDescriptor;
5051

5152
private:
53+
friend class Heap;
54+
friend class compiler::AccessBuilder;
55+
5256
inline bool IsValid() const;
5357

54-
TQ_OBJECT_CONSTRUCTORS(FreeSpace)
58+
TaggedMember<Smi> size_;
59+
#ifdef V8_EXTERNAL_CODE_SPACE
60+
TaggedMember<Smi> next_;
61+
#else
62+
TaggedMember<FreeSpace> next_;
63+
#endif // V8_EXTERNAL_CODE_SPACE
5564
};
5665

5766
} // namespace internal

0 commit comments

Comments
 (0)