1 // Copyright 2022 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_COMMON_PTR_COMPR_H_ 6 #define V8_COMMON_PTR_COMPR_H_ 7 8 #include "src/base/memory.h" 9 #include "src/common/globals.h" 10 11 namespace v8 { 12 namespace internal { 13 14 // Accessors for fields that may be unaligned due to pointer compression. 15 16 template <typename V> ReadMaybeUnalignedValue(Address p)17static inline V ReadMaybeUnalignedValue(Address p) { 18 // Pointer compression causes types larger than kTaggedSize to be unaligned. 19 #ifdef V8_COMPRESS_POINTERS 20 constexpr bool v8_pointer_compression_unaligned = sizeof(V) > kTaggedSize; 21 #else 22 constexpr bool v8_pointer_compression_unaligned = false; 23 #endif 24 // Bug(v8:8875) Double fields may be unaligned. 25 constexpr bool unaligned_double_field = 26 std::is_same<V, double>::value && kDoubleSize > kTaggedSize; 27 if (unaligned_double_field || v8_pointer_compression_unaligned) { 28 return base::ReadUnalignedValue<V>(p); 29 } else { 30 return base::Memory<V>(p); 31 } 32 } 33 34 template <typename V> WriteMaybeUnalignedValue(Address p,V value)35static inline void WriteMaybeUnalignedValue(Address p, V value) { 36 // Pointer compression causes types larger than kTaggedSize to be unaligned. 37 #ifdef V8_COMPRESS_POINTERS 38 constexpr bool v8_pointer_compression_unaligned = sizeof(V) > kTaggedSize; 39 #else 40 constexpr bool v8_pointer_compression_unaligned = false; 41 #endif 42 // Bug(v8:8875) Double fields may be unaligned. 43 constexpr bool unaligned_double_field = 44 std::is_same<V, double>::value && kDoubleSize > kTaggedSize; 45 if (unaligned_double_field || v8_pointer_compression_unaligned) { 46 base::WriteUnalignedValue<V>(p, value); 47 } else { 48 base::Memory<V>(p) = value; 49 } 50 } 51 52 } // namespace internal 53 } // namespace v8 54 55 #endif // V8_COMMON_PTR_COMPR_H_ 56