v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
tagged-payload.h
Go to the documentation of this file.
1// Copyright 2024 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_SANDBOX_TAGGED_PAYLOAD_H_
6#define V8_SANDBOX_TAGGED_PAYLOAD_H_
7
10
11namespace v8 {
12namespace internal {
13
14// Struct providing common utilities for pointer tagging.
15template <typename PayloadTaggingScheme>
17 static_assert(PayloadTaggingScheme::kMarkBit != 0,
18 "Invalid kMarkBit specified in tagging scheme.");
19 // The mark bit does not overlap with the TagMask.
20 static_assert((PayloadTaggingScheme::kMarkBit &
21 PayloadTaggingScheme::kTagMask) == 0);
22
23 TaggedPayload(Address pointer, typename PayloadTaggingScheme::TagType tag)
24 : encoded_word_(Tag(pointer, tag)) {}
25
26 Address Untag(typename PayloadTaggingScheme::TagType tag) const {
27 return encoded_word_ & ~(tag | PayloadTaggingScheme::kMarkBit);
28 }
29
30 static Address Tag(Address pointer,
31 typename PayloadTaggingScheme::TagType tag) {
32 return pointer | tag;
33 }
34
35 bool IsTaggedWith(typename PayloadTaggingScheme::TagType tag) const {
36 return (encoded_word_ & PayloadTaggingScheme::kTagMask) == tag;
37 }
38
39 void SetTag(typename PayloadTaggingScheme::TagType new_tag) {
40 encoded_word_ = (encoded_word_ & ~PayloadTaggingScheme::kTagMask) | new_tag;
41 }
42
43 void SetMarkBit() { encoded_word_ |= PayloadTaggingScheme::kMarkBit; }
44
45 void ClearMarkBit() { encoded_word_ &= ~PayloadTaggingScheme::kMarkBit; }
46
47 bool HasMarkBitSet() const {
48 return (encoded_word_ & PayloadTaggingScheme::kMarkBit) != 0;
49 }
50
51 uint32_t ExtractFreelistLink() const {
52 return static_cast<uint32_t>(encoded_word_);
53 }
54
55 typename PayloadTaggingScheme::TagType ExtractTag() const {
56 return static_cast<typename PayloadTaggingScheme::TagType>(
57 (encoded_word_ & PayloadTaggingScheme::kTagMask) |
58 PayloadTaggingScheme::kMarkBit);
59 }
60
61 bool ContainsFreelistLink() const {
62 return IsTaggedWith(PayloadTaggingScheme::kFreeEntryTag);
63 }
64
66 if constexpr (PayloadTaggingScheme::kSupportsEvacuation) {
67 return IsTaggedWith(PayloadTaggingScheme::kEvacuationEntryTag);
68 } else {
69 return false;
70 }
71 }
72
73 bool IsZapped() const {
74 if constexpr (PayloadTaggingScheme::kSupportsZapping) {
75 return IsTaggedWith(PayloadTaggingScheme::kZappedEntryTag);
76 } else {
77 return false;
78 }
79 }
80
82 if constexpr (PayloadTaggingScheme::kSupportsEvacuation) {
83 return Untag(PayloadTaggingScheme::kEvacuationEntryTag);
84 } else {
86 }
87 }
88
89 bool ContainsPointer() const {
91 }
92
93 bool operator==(TaggedPayload other) const {
94 return encoded_word_ == other.encoded_word_;
95 }
96
97 bool operator!=(TaggedPayload other) const {
98 return encoded_word_ != other.encoded_word_;
99 }
100
101 private:
103};
104
105} // namespace internal
106} // namespace v8
107
108#endif // V8_SANDBOX_TAGGED_PAYLOAD_H_
constexpr int kTagMask
Definition reloc-info.h:72
Address Untag(typename PayloadTaggingScheme::TagType tag) const
TaggedPayload(Address pointer, typename PayloadTaggingScheme::TagType tag)
PayloadTaggingScheme::TagType ExtractTag() const
static Address Tag(Address pointer, typename PayloadTaggingScheme::TagType tag)
bool IsTaggedWith(typename PayloadTaggingScheme::TagType tag) const
uint32_t ExtractFreelistLink() const
bool operator!=(TaggedPayload other) const
bool operator==(TaggedPayload other) const
void SetTag(typename PayloadTaggingScheme::TagType new_tag)
Address ExtractEvacuationEntryHandleLocation() const