| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
- // This source code is licensed under both the GPLv2 (found in the
- // COPYING file in the root directory) and Apache 2.0 License
- // (found in the LICENSE.Apache file in the root directory).
- #pragma once
- #ifndef FALLTHROUGH_INTENDED
- #if defined(__clang__)
- #define FALLTHROUGH_INTENDED [[clang::fallthrough]]
- #elif defined(__GNUC__) && __GNUC__ >= 7
- #define FALLTHROUGH_INTENDED [[gnu::fallthrough]]
- #else
- #define FALLTHROUGH_INTENDED \
- do { \
- } while (0)
- #endif
- #endif
- #define DECLARE_DEFAULT_MOVES(Name) \
- Name(Name&&) noexcept = default; \
- Name& operator=(Name&&) = default
- // ASAN (Address sanitizer)
- #if defined(__clang__)
- #if defined(__has_feature)
- #if __has_feature(address_sanitizer)
- #define MUST_FREE_HEAP_ALLOCATIONS 1
- #endif // __has_feature(address_sanitizer)
- #endif // defined(__has_feature)
- #else // __clang__
- #ifdef __SANITIZE_ADDRESS__
- #define MUST_FREE_HEAP_ALLOCATIONS 1
- #endif // __SANITIZE_ADDRESS__
- #endif // __clang__
- #ifdef ROCKSDB_VALGRIND_RUN
- #define MUST_FREE_HEAP_ALLOCATIONS 1
- #endif // ROCKSDB_VALGRIND_RUN
- // Coding guidelines say to avoid static objects with non-trivial destructors,
- // because it's easy to cause trouble (UB) in static destruction. This
- // macro makes it easier to define static objects that are normally never
- // destructed, except are destructed when running under ASAN. This should
- // avoid unexpected, unnecessary destruction behavior in production.
- // Note that constructor arguments can be provided as in
- // STATIC_AVOID_DESTRUCTION(Foo, foo)(arg1, arg2);
- #ifdef MUST_FREE_HEAP_ALLOCATIONS
- #define STATIC_AVOID_DESTRUCTION(Type, name) static Type name
- constexpr bool kMustFreeHeapAllocations = true;
- #else
- #define STATIC_AVOID_DESTRUCTION(Type, name) static Type& name = *new Type
- constexpr bool kMustFreeHeapAllocations = false;
- #endif
- // TSAN (Thread sanitizer)
- // For simplicity, standardize on the GCC define
- #if defined(__clang__)
- #if defined(__has_feature) && __has_feature(thread_sanitizer)
- #define __SANITIZE_THREAD__ 1
- #endif // __has_feature(thread_sanitizer)
- #endif // __clang__
- #ifdef __SANITIZE_THREAD__
- #define TSAN_SUPPRESSION __attribute__((no_sanitize("thread")))
- #else
- #define TSAN_SUPPRESSION
- #endif // TSAN_SUPPRESSION
- // Compile-time CPU feature testing compatibility
- //
- // A way to be extra sure these defines have been included.
- #define ASSERT_FEATURE_COMPAT_HEADER() \
- static_assert(true, "Semicolon required") /* empty */
- // MSVC doesn't support the same defines that gcc and clang provide
- // but does some like __AVX__. Here we can infer some features from others.
- #ifdef __AVX__
- #define __SSE4_2__ 1
- #define __PCLMUL__ 1
- #endif // __AVX__
- // A way to disable PCLMUL
- #ifdef NO_PCLMUL
- #undef __PCLMUL__
- #endif
- // popcnt is generally implied by SSE4.2
- #if defined(__SSE4_2__)
- #define __POPCNT__ 1
- #endif
- // A way to disable POPCNT
- #ifdef NO_POPCNT
- #undef __POPCNT__
- #endif
|