// Copyright 2022 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMMON_PTR_COMPR_H_ #define V8_COMMON_PTR_COMPR_H_ #include "src/base/memory.h" #include "src/common/globals.h" namespace v8::internal { class IsolateGroup; // This is just a collection of common compression scheme related functions. // Each pointer compression cage then has its own compression scheme, which // mainly differes in the cage base address they use. template <typename Cage> class V8HeapCompressionSchemeImpl { … }; // The main pointer compression cage, used for most objects. class MainCage : public AllStatic { … }; V8HeapCompressionScheme; #ifdef V8_ENABLE_SANDBOX // Compression scheme used for compressed pointers between trusted objects in // the trusted heap space, outside of the sandbox. class TrustedCage : public AllStatic { … }; TrustedSpaceCompressionScheme; #else // The trusted cage does not exist in this case. using TrustedSpaceCompressionScheme = V8HeapCompressionScheme; #endif // V8_ENABLE_SANDBOX // A compression scheme which can be passed if the only objects we ever expect // to see are Smis (e.g. for {TaggedField<Smi, 0, SmiCompressionScheme>}). class SmiCompressionScheme : public AllStatic { … }; #ifdef V8_EXTERNAL_CODE_SPACE // Compression scheme used for fields containing InstructionStream objects // (namely for the Code::code field). Same as // V8HeapCompressionScheme but with a different base value. // TODO(ishell): consider also using V8HeapCompressionSchemeImpl here unless // this becomes a different compression scheme that allows crossing the 4GB // boundary. class ExternalCodeCompressionScheme { … }; #endif // V8_EXTERNAL_CODE_SPACE // Accessors for fields that may be unaligned due to pointer compression. template <typename V> static inline V ReadMaybeUnalignedValue(Address p) { … } template <typename V> static inline void WriteMaybeUnalignedValue(Address p, V value) { … } // When multi-cage pointer compression mode is enabled this scope object // saves current cage's base values and sets them according to given Isolate. // For all other configurations this scope object is a no-op. class PtrComprCageAccessScope final { … }; } // namespace v8::internal #endif // V8_COMMON_PTR_COMPR_H_