5 #ifndef V8_BASE_MACROS_H_ 6 #define V8_BASE_MACROS_H_ 10 #include "src/base/compiler-specific.h" 11 #include "src/base/format-macros.h" 12 #include "src/base/logging.h" 23 #define OFFSET_OF(type, field) \ 24 (reinterpret_cast<intptr_t>(&(reinterpret_cast<type*>(16)->field)) - 16) 31 #define arraysize(array) (sizeof(ArraySizeHelper(array))) 37 template <
typename T,
size_t N>
38 char (&ArraySizeHelper(T (&array)[N]))[N];
45 template <
typename T,
size_t N>
46 char (&ArraySizeHelper(
const T (&array)[N]))[N];
102 template <
class Dest,
class Source>
103 V8_INLINE Dest bit_cast(Source
const& source) {
104 static_assert(
sizeof(Dest) ==
sizeof(Source),
105 "source and dest must be same size");
107 memcpy(&dest, &source,
sizeof(dest));
112 #define DISALLOW_ASSIGN(TypeName) TypeName& operator=(const TypeName&) = delete; 115 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 116 TypeName(const TypeName&) = delete; \ 117 DISALLOW_ASSIGN(TypeName) 120 #define DISALLOW_COPY_AND_MOVE_AND_ASSIGN(TypeName) \ 121 TypeName(TypeName&&) = delete; \ 122 TypeName& operator=(TypeName&&) = delete; \ 123 DISALLOW_COPY_AND_ASSIGN(TypeName) 128 #define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ 129 TypeName() = delete; \ 130 DISALLOW_COPY_AND_ASSIGN(TypeName) 134 #define MOVE_ONLY_WITH_DEFAULT_CONSTRUCTORS(TypeName) \ 135 TypeName() = default; \ 136 MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(TypeName) 140 #define MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(TypeName) \ 141 TypeName(TypeName&&) V8_NOEXCEPT = default; \ 142 TypeName& operator=(TypeName&&) V8_NOEXCEPT = default; \ 143 DISALLOW_COPY_AND_ASSIGN(TypeName) 151 #define DISALLOW_NEW_AND_DELETE() \ 152 void* operator new(size_t) { base::OS::Abort(); } \ 153 void* operator new[](size_t) { base::OS::Abort(); }; \ 154 void operator delete(void*, size_t) { base::OS::Abort(); } \ 155 void operator delete[](void*, size_t) { base::OS::Abort(); } 158 #if defined(__has_feature) 159 #if __has_feature(address_sanitizer) 160 #define V8_USE_ADDRESS_SANITIZER 1 165 #ifdef V8_USE_ADDRESS_SANITIZER 166 #define DISABLE_ASAN __attribute__((no_sanitize_address)) 172 #if defined(__has_feature) 173 #if __has_feature(memory_sanitizer) 174 #define V8_USE_MEMORY_SANITIZER 1 179 #if defined(__clang__) && defined(__has_attribute) 180 #if __has_attribute(no_sanitize) 181 #define CLANG_NO_SANITIZE(what) __attribute__((no_sanitize(what))) 184 #if !defined(CLANG_NO_SANITIZE) 185 #define CLANG_NO_SANITIZE(what) 189 #define DISABLE_CFI_PERF CLANG_NO_SANITIZE("cfi") 193 #define DISABLE_CFI_ICALL CLANG_NO_SANITIZE("cfi-icall") 196 #define V8_IMMEDIATE_CRASH() __builtin_trap() 198 #define V8_IMMEDIATE_CRASH() ((void(*)())0)() 204 #define STATIC_ASSERT(test) static_assert(test, #test) 213 template <
typename T>
223 static constexpr
bool value =
225 (std::is_trivially_copy_constructible<T>::value ||
226 !std::is_copy_constructible<T>::value) &&
228 (std::is_trivially_copy_assignable<T>::value ||
229 !std::is_copy_assignable<T>::value) &&
231 (std::is_trivially_move_constructible<T>::value ||
232 !std::is_move_constructible<T>::value) &&
234 (std::is_trivially_move_assignable<T>::value ||
235 !std::is_move_assignable<T>::value) &&
239 std::is_trivially_destructible<T>::value;
241 #elif defined(__GNUC__) && __GNUC__ < 5 249 static constexpr
bool value =
250 __has_trivial_copy(
T) && __has_trivial_destructor(
T);
253 static constexpr
bool value = std::is_trivially_copyable<T>::value;
256 #if defined(__GNUC__) && __GNUC__ < 5 259 #define ASSERT_TRIVIALLY_COPYABLE(T) static_assert(true, "check disabled") 260 #define ASSERT_NOT_TRIVIALLY_COPYABLE(T) static_assert(true, "check disabled") 262 #define ASSERT_TRIVIALLY_COPYABLE(T) \ 263 static_assert(::v8::base::is_trivially_copyable<T>::value, \ 264 #T " should be trivially copyable") 265 #define ASSERT_NOT_TRIVIALLY_COPYABLE(T) \ 266 static_assert(!::v8::base::is_trivially_copyable<T>::value, \ 267 #T " should not be trivially copyable") 274 template <
typename T>
279 ::v8::base::Use unused_tmp_array_for_use_macro[]{__VA_ARGS__}; \ 280 (void)unused_tmp_array_for_use_macro; \ 287 #define ITERATE_PACK(...) USE(0, ((__VA_ARGS__), 0)...) 296 V8_INLINE A implicit_cast(A x) {
304 # if V8_HOST_ARCH_64_BIT 305 # define V8_PTR_PREFIX "ll" 307 # define V8_PTR_PREFIX "" 308 # endif // V8_HOST_ARCH_64_BIT 310 # define V8_PTR_PREFIX "I64" 311 #elif V8_HOST_ARCH_64_BIT 312 # define V8_PTR_PREFIX "l" 315 #define V8_PTR_PREFIX "l" 317 # define V8_PTR_PREFIX "" 321 #define V8PRIxPTR V8_PTR_PREFIX "x" 322 #define V8PRIdPTR V8_PTR_PREFIX "d" 323 #define V8PRIuPTR V8_PTR_PREFIX "u" 325 #ifdef V8_TARGET_ARCH_64_BIT 326 #define V8_PTR_HEX_DIGITS 12 327 #define V8PRIxPTR_FMT "0x%012" V8PRIxPTR 329 #define V8_PTR_HEX_DIGITS 8 330 #define V8PRIxPTR_FMT "0x%08" V8PRIxPTR 335 #define V8PRIxPTRDIFF "Ix" 336 #define V8PRIdPTRDIFF "Id" 337 #define V8PRIuPTRDIFF "Iu" 339 #define V8PRIxPTRDIFF "tx" 340 #define V8PRIdPTRDIFF "td" 341 #define V8PRIuPTRDIFF "tu" 347 #define V8PRIxPTR "lx" 349 #define V8PRIdPTR "ld" 351 #define V8PRIuPTR "lxu" 357 #define V8_2PART_UINT64_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u)) 360 template <
typename T>
361 inline T RoundDown(T x, intptr_t m) {
362 STATIC_ASSERT(std::is_integral<T>::value);
364 DCHECK(m != 0 && ((m & (m - 1)) == 0));
367 template <
intptr_t m,
typename T>
368 constexpr
inline T RoundDown(T x) {
369 STATIC_ASSERT(std::is_integral<T>::value);
371 STATIC_ASSERT(m != 0 && ((m & (m - 1)) == 0));
376 template <
typename T>
377 inline T RoundUp(T x, intptr_t m) {
378 STATIC_ASSERT(std::is_integral<T>::value);
379 return RoundDown<T>(
static_cast<T
>(x + m - 1), m);
381 template <
intptr_t m,
typename T>
382 constexpr
inline T RoundUp(T x) {
383 STATIC_ASSERT(std::is_integral<T>::value);
384 return RoundDown<m, T>(
static_cast<T
>(x + (m - 1)));
387 template <
typename T,
typename U>
388 constexpr
inline bool IsAligned(T value, U alignment) {
389 return (value & (alignment - 1)) == 0;
392 inline void* AlignedAddress(
void* address,
size_t alignment) {
394 DCHECK_EQ(alignment & (alignment - 1), 0u);
395 return reinterpret_cast<void*
>(
reinterpret_cast<uintptr_t>(address) &
396 ~static_cast<uintptr_t>(alignment - 1));
401 template <
typename int_t,
typename float_t,
typename biggest_
int_t =
int64_t>
402 bool is_inbounds(float_t v) {
403 static_assert(
sizeof(int_t) <
sizeof(biggest_int_t),
404 "int_t can't be bounds checked by the compiler");
405 constexpr float_t kLowerBound =
406 static_cast<float_t
>(std::numeric_limits<int_t>::min()) - 1;
407 constexpr float_t kUpperBound =
408 static_cast<float_t
>(std::numeric_limits<int_t>::max()) + 1;
409 constexpr
bool kLowerBoundIsMin =
410 static_cast<biggest_int_t
>(kLowerBound) ==
411 static_cast<biggest_int_t>(std::numeric_limits<int_t>::min());
412 constexpr
bool kUpperBoundIsMax =
413 static_cast<biggest_int_t
>(kUpperBound) ==
414 static_cast<biggest_int_t>(std::numeric_limits<int_t>::max());
415 return (kLowerBoundIsMin ? (kLowerBound <= v) : (kLowerBound < v)) &&
416 (kUpperBoundIsMax ? (v <= kUpperBound) : (v < kUpperBound));
422 #ifdef BUILDING_V8_SHARED 423 #define V8_EXPORT_PRIVATE __declspec(dllexport) 424 #elif USING_V8_SHARED 425 #define V8_EXPORT_PRIVATE __declspec(dllimport) 427 #define V8_EXPORT_PRIVATE 428 #endif // BUILDING_V8_SHARED 433 #if V8_HAS_ATTRIBUTE_VISIBILITY 434 #ifdef BUILDING_V8_SHARED 435 #define V8_EXPORT_PRIVATE __attribute__((visibility("default"))) 437 #define V8_EXPORT_PRIVATE 440 #define V8_EXPORT_PRIVATE 445 #endif // V8_BASE_MACROS_H_