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)