5#ifndef V8_COMMON_PTR_COMPR_INL_H_
6#define V8_COMMON_PTR_COMPR_INL_H_
15#ifdef V8_ENABLE_SANDBOX
22#ifdef V8_COMPRESS_POINTERS
25 : address_(isolate->cage_base()) {}
26PtrComprCageBase::PtrComprCageBase(
const LocalIsolate* isolate)
27 : address_(isolate->cage_base()) {}
33constexpr Address kPtrComprCageBaseMask = ~(kPtrComprCageBaseAlignment - 1);
36template <
typename Cage>
37constexpr Address V8HeapCompressionSchemeImpl<Cage>::GetPtrComprCageBaseAddress(
38 Address on_heap_addr) {
43template <
typename Cage>
44Address V8HeapCompressionSchemeImpl<Cage>::GetPtrComprCageBaseAddress(
45 PtrComprCageBase cage_base) {
49 reinterpret_cast<void*
>(
base), kPtrComprCageBaseAlignment));
54template <
typename Cage>
55void V8HeapCompressionSchemeImpl<Cage>::InitBase(Address
base) {
57#if defined(USING_V8_SHARED_PRIVATE) && \
58 defined(V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES)
59 Cage::set_base_non_inlined(
base);
66template <
typename Cage>
67Address V8HeapCompressionSchemeImpl<Cage>::base() {
68#if defined(USING_V8_SHARED_PRIVATE) && \
69 defined(V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES)
79 reinterpret_cast<void*
>(
base), kPtrComprCageBaseAlignment));
83template <
typename Cage>
84Tagged_t V8HeapCompressionSchemeImpl<Cage>::CompressObject(Address tagged) {
87#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE
89 (tagged & kPtrComprCageBaseMask) ==
base());
91 return static_cast<Tagged_t>(tagged);
95template <
typename Cage>
96constexpr Tagged_t V8HeapCompressionSchemeImpl<Cage>::CompressAny(
98 return static_cast<Tagged_t>(tagged);
102template <
typename Cage>
103Address V8HeapCompressionSchemeImpl<Cage>::DecompressTaggedSigned(
104 Tagged_t raw_value) {
106 return static_cast<Address>(raw_value);
110template <
typename Cage>
111template <
typename TOnHeapAddress>
112Address V8HeapCompressionSchemeImpl<Cage>::DecompressTagged(
113 TOnHeapAddress on_heap_addr, Tagged_t raw_value) {
114#ifdef V8_COMPRESS_POINTERS
116#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
118 "V8HeapCompressionSchemeImpl::base is not initialized for "
122 Address cage_base = GetPtrComprCageBaseAddress(on_heap_addr);
130template <
typename Cage>
131template <
typename ProcessPo
interCallback>
132void V8HeapCompressionSchemeImpl<Cage>::ProcessIntermediatePointers(
133 PtrComprCageBase cage_base, Address raw_value,
139 V8HeapCompressionSchemeImpl<Cage>::DecompressTagged(
140 cage_base,
static_cast<Tagged_t>(raw_value));
143 V8HeapCompressionSchemeImpl<Cage>::DecompressTagged(
145 static_cast<Tagged_t>(raw_value >> (
sizeof(Tagged_t) * CHAR_BIT)));
149#ifdef V8_EXTERNAL_CODE_SPACE
158Address ExternalCodeCompressionScheme::PrepareCageBaseAddress(
159 Address on_heap_addr) {
164Address ExternalCodeCompressionScheme::GetPtrComprCageBaseAddress(
165 PtrComprCageBase cage_base) {
174void ExternalCodeCompressionScheme::InitBase(Address
base) {
176#if defined(USING_V8_SHARED_PRIVATE) && \
177 defined(V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES)
178 set_base_non_inlined(
base);
186#if defined(USING_V8_SHARED_PRIVATE) && \
187 defined(V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES)
196 return reinterpret_cast<Address>(
201Tagged_t ExternalCodeCompressionScheme::CompressObject(Address tagged) {
203#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE
206 (
base() <= tagged) && (tagged <
base() + kPtrComprCageReservationSize));
208 return static_cast<Tagged_t>(tagged);
212constexpr Tagged_t ExternalCodeCompressionScheme::CompressAny(Address tagged) {
213 return static_cast<Tagged_t>(tagged);
217Address ExternalCodeCompressionScheme::DecompressTaggedSigned(
218 Tagged_t raw_value) {
220 return static_cast<Address>(raw_value);
224template <
typename TOnHeapAddress>
225Address ExternalCodeCompressionScheme::DecompressTagged(
226 TOnHeapAddress on_heap_addr, Tagged_t raw_value) {
227#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
233 if (
HAS_SMI_TAG(raw_value))
return DecompressTaggedSigned(raw_value);
236#ifdef V8_COMPRESS_POINTERS
238#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
240 "ExternalCodeCompressionScheme::base is not initialized for "
244 Address cage_base = GetPtrComprCageBaseAddress(on_heap_addr);
246 V8_ASSUME((cage_base & kMinExpectedOSPageSizeMask) == cage_base);
248 Address diff =
static_cast<Address>(
static_cast<uint32_t
>(raw_value)) -
249 static_cast<Address>(
static_cast<uint32_t
>(cage_base));
253 if (
static_cast<intptr_t
>(diff) < 0) {
254 diff +=
size_t{4} * GB;
263template <
typename ProcessPo
interCallback>
264void ExternalCodeCompressionScheme::ProcessIntermediatePointers(
265 PtrComprCageBase cage_base, Address raw_value,
270 Address decompressed_low = ExternalCodeCompressionScheme::DecompressTagged(
271 cage_base,
static_cast<Tagged_t>(raw_value));
273 Address decompressed_high = ExternalCodeCompressionScheme::DecompressTagged(
275 static_cast<Tagged_t>(raw_value >> (
sizeof(Tagged_t) * CHAR_BIT)));
287 return PtrComprCageBase(
288 V8HeapCompressionScheme::GetPtrComprCageBaseAddress(address));
293 return PtrComprCageBase(V8HeapCompressionScheme::base());
303template <
typename Cage>
305 Address on_heap_addr) {
311template <
typename Cage>
317template <
typename Cage>
325template <
typename Cage>
332template <
typename Cage>
333template <
typename TOnHeapAddress>
335 TOnHeapAddress on_heap_addr,
Tagged_t raw_value) {
340template <
typename Cage>
341template <
typename ProcessPo
interCallback>
365#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
367PtrComprCageAccessScope::PtrComprCageAccessScope(
Isolate* isolate)
368 : cage_base_(V8HeapCompressionScheme::
base()),
369#ifdef V8_EXTERNAL_CODE_SPACE
370 code_cage_base_(ExternalCodeCompressionScheme::
base()),
373#ifdef V8_ENABLE_SANDBOX
375 saved_current_sandbox_(Sandbox::current())
379#ifdef V8_EXTERNAL_CODE_SPACE
380 ExternalCodeCompressionScheme::InitBase(isolate->code_cage_base());
382 IsolateGroup::set_current(isolate->isolate_group());
383#ifdef V8_ENABLE_SANDBOX
384 Sandbox::set_current(isolate->isolate_group()->sandbox());
388PtrComprCageAccessScope::~PtrComprCageAccessScope() {
389 V8HeapCompressionScheme::InitBase(cage_base_);
390#ifdef V8_EXTERNAL_CODE_SPACE
391 ExternalCodeCompressionScheme::InitBase(code_cage_base_);
393 IsolateGroup::set_current(saved_current_isolate_group_);
394#ifdef V8_ENABLE_SANDBOX
395 Sandbox::set_current(saved_current_sandbox_);
PtrComprCageBase()=default
static V8_INLINE void InitBase(Address base)
#define HAS_SMI_TAG(value)
ZoneVector< RpoNumber > & result
V8_INLINE constexpr PtrComprCageBase GetPtrComprCageBaseFromOnHeapAddress(Address address)
constexpr size_t kMinExpectedOSPageSize
V8_INLINE PtrComprCageBase GetPtrComprCageBase()
#define DCHECK_WITH_MSG(condition, msg)
#define DCHECK_IMPLIES(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
constexpr T RoundDown(T x, intptr_t m)
#define V8_ASSUME_ALIGNED(ptr, alignment)