mirror of https://github.com/mongodb/mongo
SERVER-98034 compiler.h consolidation (#30040)
GitOrigin-RevId: 27d91db841953662a6780bcc4faba34dc257bd5a
This commit is contained in:
parent
ac569aee20
commit
06a5ad28c8
|
|
@ -1,5 +1,4 @@
|
||||||
[
|
[
|
||||||
{include: ["\"mongo/platform/compiler_gcc.h\"", "private", "\"mongo/platform/compiler.h\"", "public"]},
|
|
||||||
{include: ["\"float.h\"", "private", "<cfloat>", "public"]},
|
{include: ["\"float.h\"", "private", "<cfloat>", "public"]},
|
||||||
{include: ["\"limits.h\"", "private", "<climits>", "public"]},
|
{include: ["\"limits.h\"", "private", "<climits>", "public"]},
|
||||||
{include: ["\"stdarg.h\"", "private", "<cstdarg>", "public"]},
|
{include: ["\"stdarg.h\"", "private", "<cstdarg>", "public"]},
|
||||||
|
|
|
||||||
|
|
@ -311,8 +311,6 @@ mongo_cc_library(
|
||||||
"//src/mongo/platform:atomic_word.h",
|
"//src/mongo/platform:atomic_word.h",
|
||||||
"//src/mongo/platform:bits.h",
|
"//src/mongo/platform:bits.h",
|
||||||
"//src/mongo/platform:compiler.h",
|
"//src/mongo/platform:compiler.h",
|
||||||
"//src/mongo/platform:compiler_gcc.h",
|
|
||||||
"//src/mongo/platform:compiler_msvc.h",
|
|
||||||
"//src/mongo/platform:decimal128.h",
|
"//src/mongo/platform:decimal128.h",
|
||||||
"//src/mongo/platform:endian.h",
|
"//src/mongo/platform:endian.h",
|
||||||
"//src/mongo/platform:int128.h",
|
"//src/mongo/platform:int128.h",
|
||||||
|
|
|
||||||
|
|
@ -30,220 +30,313 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Include "mongo/platform/compiler.h" to get compiler-targeted macro definitions and utilities.
|
* Compiler-targeted macro definitions and utilities.
|
||||||
*
|
*/
|
||||||
* The following macros are provided in all compiler environments:
|
|
||||||
*
|
#if !defined(_MSC_VER) && !defined(__GNUC__)
|
||||||
*
|
#error "Unsupported compiler family"
|
||||||
* MONGO_COMPILER_COLD_FUNCTION
|
#endif
|
||||||
*
|
|
||||||
* Informs the compiler that the function is cold. This can have the following effects:
|
/**
|
||||||
* - The function is optimized for size over speed.
|
* Define clang's has_feature macro for other compilers
|
||||||
* - The function may be placed in a special cold section of the binary, away from other code.
|
* See https://clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension
|
||||||
* - Code paths that call this function are considered implicitly unlikely.
|
*/
|
||||||
*
|
#if !defined(__has_feature)
|
||||||
*
|
#define __has_feature(x) 0
|
||||||
* MONGO_COMPILER_NORETURN
|
#endif
|
||||||
|
|
||||||
|
/** Allows issuing pragmas through macros. Arguments appear exactly as in a #pragma. */
|
||||||
|
#define MONGO_COMPILER_PRAGMA(p) _Pragma(#p)
|
||||||
|
|
||||||
|
#if defined(__has_cpp_attribute)
|
||||||
|
#define MONGO_COMPILER_HAS_ATTRIBUTE(x) __has_cpp_attribute(x)
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_HAS_ATTRIBUTE(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Microsoft Visual C++ (MSVC) only. */
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define MONGO_COMPILER_IF_MSVC(...) __VA_ARGS__
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_IF_MSVC(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Clang or GCC. */
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define MONGO_COMPILER_IF_GNUC(...) __VA_ARGS__
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_IF_GNUC(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__clang__)
|
||||||
|
#define MONGO_COMPILER_IF_CLANG(...) MONGO_COMPILER_IF_GNUC(__VA_ARGS__)
|
||||||
|
#define MONGO_COMPILER_IF_GCC(...)
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_IF_CLANG(...)
|
||||||
|
#define MONGO_COMPILER_IF_GCC(...) MONGO_COMPILER_IF_GNUC(__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** GCC >= v14.x only. */
|
||||||
|
#if __GNUC__ >= 14
|
||||||
|
#define MONGO_COMPILER_IF_GCC14(...) MONGO_COMPILER_IF_GCC(__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_IF_GCC14(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Informs the compiler that the function is cold. This can have the following effects:
|
||||||
|
* - The function is optimized for size over speed.
|
||||||
|
* - The function may be placed in a special cold section of the binary, away from other code.
|
||||||
|
* - Code paths that call this function are considered implicitly unlikely.
|
||||||
*
|
*
|
||||||
|
* Cannot use new attribute syntax due to grammatical placement, especially on lambdas.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_COLD_FUNCTION MONGO_COMPILER_IF_GNUC(__attribute__((__cold__)))
|
||||||
|
|
||||||
|
/**
|
||||||
* Instructs the compiler that the decorated function will not return through the normal return
|
* Instructs the compiler that the decorated function will not return through the normal return
|
||||||
* path. All noreturn functions are also implicitly cold since they are either run-once code
|
* path. All noreturn functions are also implicitly cold since they are either run-once code
|
||||||
* executed at startup or shutdown or code that handles errors by throwing an exception.
|
* executed at startup or shutdown or code that handles errors by throwing an exception.
|
||||||
*
|
*
|
||||||
* Correct: MONGO_COMPILER_NORETURN void myAbortFunction();
|
* Example:
|
||||||
*
|
* MONGO_COMPILER_NORETURN void myAbortFunction();
|
||||||
*
|
*/
|
||||||
* MONGO_COMPILER_ALIGN_TYPE(ALIGNMENT)
|
#define MONGO_COMPILER_NORETURN [[noreturn]] MONGO_COMPILER_COLD_FUNCTION
|
||||||
*
|
|
||||||
* Instructs the compiler to use the given minimum alignment for the decorated type.
|
/**
|
||||||
*
|
|
||||||
* Alignments should probably always be powers of two. Also, note that most allocators will not
|
|
||||||
* be able to guarantee better than 16- or 32-byte alignment.
|
|
||||||
*
|
|
||||||
* Correct:
|
|
||||||
* class MONGO_COMPILER_ALIGN_TYPE(16) MyClass {...};
|
|
||||||
*
|
|
||||||
* Incorrect:
|
|
||||||
* MONGO_COMPILER_ALIGN_TYPE(16) class MyClass {...};
|
|
||||||
* class MyClass{...} MONGO_COMPILER_ALIGN_TYPE(16);
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_ALIGN_VARIABLE(ALIGNMENT)
|
|
||||||
*
|
|
||||||
* Instructs the compiler to use the given minimum alignment for the decorated variable.
|
|
||||||
*
|
|
||||||
* Note that most allocators will not allow heap allocated alignments that are better than 16- or
|
|
||||||
* 32-byte aligned. Stack allocators may only guarantee up to the natural word length worth of
|
|
||||||
* alignment.
|
|
||||||
*
|
|
||||||
* Correct:
|
|
||||||
* class MyClass {
|
|
||||||
* MONGO_COMPILER_ALIGN_VARIABLE(8) char a;
|
|
||||||
* };
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_ALIGN_VARIABLE(8) class MyClass {...} singletonInstance;
|
|
||||||
*
|
|
||||||
* Incorrect:
|
|
||||||
* int MONGO_COMPILER_ALIGN_VARIABLE(16) a, b;
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_API_EXPORT
|
|
||||||
*
|
|
||||||
* Instructs the compiler to label the given type, variable or function as part of the
|
* Instructs the compiler to label the given type, variable or function as part of the
|
||||||
* exported interface of the library object under construction.
|
* exported interface of the library object under construction.
|
||||||
*
|
*
|
||||||
* Correct:
|
* Usage:
|
||||||
* MONGO_COMPILER_API_EXPORT int globalSwitch;
|
* MONGO_COMPILER_API_EXPORT int globalSwitch;
|
||||||
* class MONGO_COMPILER_API_EXPORT ExportedType { ... };
|
* class MONGO_COMPILER_API_EXPORT ExportedType { ... };
|
||||||
* MONGO_COMPILER_API_EXPORT SomeType exportedFunction(...);
|
* MONGO_COMPILER_API_EXPORT SomeType exportedFunction(...);
|
||||||
*
|
*
|
||||||
* NOTE: Rather than using this macro directly, one typically declares another macro named
|
* NOTE: Rather than using this macro directly, one typically declares another macro named
|
||||||
* for the library, which is conditionally defined to either MONGO_COMIPLER_API_EXPORT or
|
* for the library, which is conditionally defined to either MONGO_COMPILER_API_EXPORT or
|
||||||
* MONGO_COMPILER_API_IMPORT based on whether the compiler is currently building the library
|
* MONGO_COMPILER_API_IMPORT based on whether the compiler is currently building the library
|
||||||
* or building an object that depends on the library, respectively. For example,
|
* or building an object that depends on the library, respectively. For example,
|
||||||
* MONGO_FOO_API might be defined to MONGO_COMPILER_API_EXPORT when building the MongoDB
|
* MONGO_FOO_API might be defined to MONGO_COMPILER_API_EXPORT when building the MongoDB
|
||||||
* libfoo shared library, and to MONGO_COMPILER_API_IMPORT when building an application that
|
* libfoo shared library, and to MONGO_COMPILER_API_IMPORT when building an application that
|
||||||
* links against that shared library.
|
* links against that shared library.
|
||||||
*
|
*
|
||||||
|
* NOTE(schwerin): These visibility and calling-convention macro definitions assume we're not using
|
||||||
|
* GCC/CLANG to target native Windows. If/when we decide to do such targeting, we'll need to change
|
||||||
|
* compiler flags on Windows to make sure we use an appropriate calling convention, and configure
|
||||||
|
* MONGO_COMPILER_API_EXPORT, MONGO_COMPILER_API_IMPORT and MONGO_COMPILER_API_CALLING_CONVENTION
|
||||||
|
* correctly. I believe "correctly" is the following:
|
||||||
*
|
*
|
||||||
* MONGO_COMPILER_API_IMPORT
|
* #ifdef _WIN32
|
||||||
*
|
* #define MONGO_COMIPLER_API_EXPORT __attribute__(( __dllexport__ ))
|
||||||
|
* #define MONGO_COMPILER_API_IMPORT __attribute__(( __dllimport__ ))
|
||||||
|
* #ifdef _M_IX86
|
||||||
|
* #define MONGO_COMPILER_API_CALLING_CONVENTION __attribute__((__cdecl__))
|
||||||
|
* #else
|
||||||
|
* #define MONGO_COMPILER_API_CALLING_CONVENTION
|
||||||
|
* #endif
|
||||||
|
* #else // ... fall through to the definitions below.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_API_EXPORT \
|
||||||
|
MONGO_COMPILER_IF_MSVC(__declspec(dllexport)) \
|
||||||
|
MONGO_COMPILER_IF_GNUC(__attribute__((__visibility__("default"))))
|
||||||
|
|
||||||
|
/**
|
||||||
* Instructs the compiler to label the given type, variable or function as imported
|
* Instructs the compiler to label the given type, variable or function as imported
|
||||||
* from another library, and not part of the library object under construction.
|
* from another library, and not part of the library object under construction.
|
||||||
*
|
*
|
||||||
* Same correct/incorrect usage as for MONGO_COMPILER_API_EXPORT.
|
* Same usage as for MONGO_COMPILER_API_EXPORT.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_API_IMPORT MONGO_COMPILER_IF_MSVC(__declspec(dllimport))
|
||||||
|
|
||||||
|
/** Hide a symbol from dynamic linking. See https://gcc.gnu.org/wiki/Visibility. */
|
||||||
|
#define MONGO_COMPILER_API_HIDDEN_FUNCTION \
|
||||||
|
MONGO_COMPILER_IF_GNUC(__attribute__((__visibility__("hidden"))))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides compiler heuristics to force a function to be inlined.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_ALWAYS_INLINE MONGO_COMPILER_ALWAYS_INLINE_
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define MONGO_COMPILER_ALWAYS_INLINE_ __forceinline
|
||||||
|
#elif MONGO_COMPILER_HAS_ATTRIBUTE(gnu::always_inline)
|
||||||
|
#define MONGO_COMPILER_ALWAYS_INLINE_ [[gnu::always_inline]]
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_ALWAYS_INLINE_
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the compiler that it can assume that this line will never execute.
|
||||||
|
* Unlike with MONGO_UNREACHABLE, there is no runtime check and reaching this
|
||||||
|
* macro is completely undefined behavior. It should only be used where it is
|
||||||
|
* provably impossible to reach, even in the face of adversarial inputs, but for
|
||||||
|
* some reason the compiler cannot figure this out on its own, for example after
|
||||||
|
* a call to a function that never returns but cannot be labeled with
|
||||||
|
* MONGO_COMPILER_NORETURN. In almost all cases MONGO_UNREACHABLE is preferred.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_UNREACHABLE \
|
||||||
|
MONGO_COMPILER_IF_MSVC(__assume(false)) \
|
||||||
|
MONGO_COMPILER_IF_GNUC(__builtin_unreachable())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the compiler that it should not attempt to inline a function. This
|
||||||
|
* option is not guaranteed to eliminate all optimizations, it only is used to
|
||||||
|
* prevent a function from being inlined.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_NOINLINE \
|
||||||
|
MONGO_COMPILER_IF_MSVC(__declspec(noinline)) \
|
||||||
|
MONGO_COMPILER_IF_GNUC([[gnu::noinline]])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for standard attribute `[[nodiscard]]`.
|
||||||
|
* https://en.cppreference.com/w/cpp/language/attributes/nodiscard
|
||||||
|
* TODO(SERVER-98127) Replace these with `[[nodiscard]]` when MSVC build is clean.
|
||||||
|
*/
|
||||||
|
#define MONGO_WARN_UNUSED_RESULT_FUNCTION MONGO_COMPILER_IF_GNUC([[nodiscard]])
|
||||||
|
#define MONGO_WARN_UNUSED_RESULT_CLASS MONGO_COMPILER_IF_GNUC([[nodiscard]])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the compiler that the function always returns a non-null value, potentially allowing
|
||||||
|
* additional optimizations at call sites.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_RETURNS_NONNULL MONGO_COMPILER_IF_GNUC([[gnu::returns_nonnull]])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the compiler that the function is "malloc like", in that the return value points
|
||||||
|
* to uninitialized memory which does not alias any other valid pointers.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_MALLOC \
|
||||||
|
MONGO_COMPILER_IF_MSVC(__declspec(restrict)) \
|
||||||
|
MONGO_COMPILER_IF_GNUC([[gnu::malloc]])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the compiler that the parameter indexed by `varindex`
|
||||||
|
* provides the size of the allocated region that a "malloc like"
|
||||||
|
* function will return a pointer to, potentially allowing static
|
||||||
|
* analysis of use of the region when the argument to the
|
||||||
|
* allocation function is a constant expression.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_ALLOC_SIZE(varindex) MONGO_COMPILER_IF_GNUC([[gnu::alloc_size(varindex)]])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the compiler that this data member is permitted to be overlapped with other non-static
|
||||||
|
* data members or base class subobjects of its class via subsituting in the
|
||||||
|
* [[no_unique_address]] attribute. On Windows, the [[msvc::no_unique_address]] attribute is
|
||||||
|
* substitued to prevent ABI-breaking changes and maintain backwards compatibility when
|
||||||
|
* compiling with MSVC. Older versions of MSVC will not take action based on the attribute,
|
||||||
|
* since the MSVC compiler ignores attributes it does not recognize.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_NO_UNIQUE_ADDRESS MONGO_COMPILER_NO_UNIQUE_ADDRESS_
|
||||||
|
#if MONGO_COMPILER_HAS_ATTRIBUTE(msvc::no_unique_address) // Use 'msvc::' if avail.
|
||||||
|
#define MONGO_COMPILER_NO_UNIQUE_ADDRESS_ [[msvc::no_unique_address]]
|
||||||
|
#elif MONGO_COMPILER_HAS_ATTRIBUTE(no_unique_address)
|
||||||
|
#define MONGO_COMPILER_NO_UNIQUE_ADDRESS_ [[no_unique_address]]
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_NO_UNIQUE_ADDRESS_
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do not optimize the function, static variable, or class template static data member, even if
|
||||||
|
* it is unused.
|
||||||
*
|
*
|
||||||
|
* Example:
|
||||||
|
* MONGO_COMPILER_USED int64_t locaInteger = 8675309;
|
||||||
|
* MONGO_COMPILER_USED void localFunction() {}
|
||||||
*
|
*
|
||||||
* MONGO_COMPILER_API_CALLING_CONVENTION
|
* See:
|
||||||
*
|
|
||||||
* Explicitly decorates a function declaration the api calling convention used for
|
|
||||||
* shared libraries.
|
|
||||||
*
|
|
||||||
* Same correct/incorrect usage as for MONGO_COMPILER_API_EXPORT.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_ALWAYS_INLINE
|
|
||||||
*
|
|
||||||
* Overrides compiler heuristics to force that a particular function should always
|
|
||||||
* be inlined.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_UNREACHABLE
|
|
||||||
*
|
|
||||||
* Tells the compiler that it can assume that this line will never execute. Unlike with
|
|
||||||
* MONGO_UNREACHABLE, there is no runtime check and reaching this macro is completely undefined
|
|
||||||
* behavior. It should only be used where it is provably impossible to reach, even in the face of
|
|
||||||
* adversarial inputs, but for some reason the compiler cannot figure this out on its own, for
|
|
||||||
* example after a call to a function that never returns but cannot be labeled with
|
|
||||||
* MONGO_COMPILER_NORETURN. In almost all cases MONGO_UNREACHABLE is preferred.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_NOINLINE
|
|
||||||
*
|
|
||||||
* Tells the compiler that it should not attempt to inline a function. This option is not
|
|
||||||
* guaranteed to eliminate all optimizations, it only is used to prevent a function from being
|
|
||||||
* inlined.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_WARN_UNUSED_RESULT_CLASS
|
|
||||||
*
|
|
||||||
* Tells the compiler that a class defines a type for which checking results is necessary. Types
|
|
||||||
* thus defined turn functions returning them into "must check results" style functions. Preview
|
|
||||||
* of the `[[nodiscard]]` C++17 attribute.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_WARN_UNUSED_RESULT_FUNCTION
|
|
||||||
*
|
|
||||||
* Tells the compiler that a function returns a value for which consuming the result is
|
|
||||||
* necessary. Functions thus defined are "must check results" style functions. Preview of the
|
|
||||||
* `[[nodiscard]]` C++17 attribute.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_RETURNS_NONNULL
|
|
||||||
*
|
|
||||||
* Tells the compiler that the function always returns a non-null value, potentially allowing
|
|
||||||
* additional optimizations at call sites.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_MALLOC
|
|
||||||
*
|
|
||||||
* Tells the compiler that the function is "malloc like", in that the return value points
|
|
||||||
* to uninitialized memory which does not alias any other valid pointers.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_ALLOC_SIZE(varindex)
|
|
||||||
*
|
|
||||||
* Tells the compiler that the parameter indexed by `varindex`
|
|
||||||
* provides the size of the allocated region that a "malloc like"
|
|
||||||
* function will return a pointer to, potentially allowing static
|
|
||||||
* analysis of use of the region when the argument to the
|
|
||||||
* allocation function is a constant expression.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_NO_UNIQUE_ADDRESS
|
|
||||||
*
|
|
||||||
* Tells the compiler that this data member is permitted to be overlapped with other non-static
|
|
||||||
* data members or base class subobjects of its class via subsituting in the
|
|
||||||
* [[no_unique_address]] attribute. On Windows, the [[msvc::no_unique_address]] attribute is
|
|
||||||
* substitued to prevent ABI-breaking changes and maintain backwards compatibility when
|
|
||||||
* compiling with MSVC. Older versions of MSVC will not take action based on the attribute,
|
|
||||||
* since the MSVC compiler ignores attributes it does not recognize.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MONGO_COMPILER_USED
|
|
||||||
*
|
|
||||||
* Do not optimize the function, static variable, or class template static data member, even if
|
|
||||||
* it is unused. Expands to `[[gnu::used]]` on GCC and Clang, and is ignored on MSVC.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* namespace {
|
|
||||||
* MONGO_COMPILER_USED int64_t locaInteger = 8675309;
|
|
||||||
* MONGO_COMPILER_USED void localFunction() {}
|
|
||||||
* template <typename T>
|
|
||||||
* struct someTemplatedStruct {
|
|
||||||
* MONGO_COMPILER_USED static inline int32_t classStaticInteger = 24601;
|
|
||||||
* MONGO_COMPILER_USED static constexpr auto classStaticString = "Unused string.";
|
|
||||||
* };
|
|
||||||
* } // namespace
|
|
||||||
*
|
|
||||||
* See:
|
|
||||||
* -
|
|
||||||
* https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute
|
* https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute
|
||||||
* -
|
|
||||||
* https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute
|
* https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute
|
||||||
*
|
*/
|
||||||
*
|
#define MONGO_COMPILER_USED MONGO_COMPILER_IF_GNUC([[gnu::used]])
|
||||||
* MONGO_GSL_POINTER
|
|
||||||
*
|
/**
|
||||||
* Hints to the compiler that this type is a gsl::Pointer type,
|
* Hints to the compiler that this type is a gsl::Pointer type,
|
||||||
* which will produce a compiler warning if this type is assigned
|
* which will produce a compiler warning if this type is assigned
|
||||||
* a temporary (xvalue) gsl::Owner type (such as std::string). This
|
* a temporary (xvalue) gsl::Owner type (such as std::string). This
|
||||||
* matches the annotation libc++ uses for std::string_view.
|
* matches the annotation libc++ uses for std::string_view.
|
||||||
*
|
*/
|
||||||
* MONGO_COMPILER_DIAGNOSTIC_*
|
#define MONGO_GSL_POINTER MONGO_GSL_POINTER_
|
||||||
*
|
#if MONGO_COMPILER_HAS_ATTRIBUTE(gsl::Pointer)
|
||||||
* Control diagnostic settings inline.
|
#define MONGO_GSL_POINTER_ [[gsl::Pointer]]
|
||||||
*
|
#else
|
||||||
|
#define MONGO_GSL_POINTER_
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Annotating methods with [[lifetimebound]] allows the compiler to do some more
|
||||||
|
* lifetime checking (e.g., "returned value should not outlive *this") and emit
|
||||||
|
* warnings. See
|
||||||
|
* https://clang.llvm.org/docs/AttributeReference.html#lifetimebound
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_LIFETIME_BOUND MONGO_COMPILER_LIFETIME_BOUND_
|
||||||
|
#if MONGO_COMPILER_HAS_ATTRIBUTE(lifetimebound)
|
||||||
|
#define MONGO_COMPILER_LIFETIME_BOUND_ [[lifetimebound]]
|
||||||
|
#elif MONGO_COMPILER_HAS_ATTRIBUTE(msvc::lifetimebound)
|
||||||
|
#define MONGO_COMPILER_LIFETIME_BOUND_ [[msvc::lifetimebound]]
|
||||||
|
#elif MONGO_COMPILER_HAS_ATTRIBUTE(clang::lifetimebound)
|
||||||
|
#define MONGO_COMPILER_LIFETIME_BOUND_ [[clang::lifetimebound]]
|
||||||
|
#else
|
||||||
|
#define MONGO_COMPILER_LIFETIME_BOUND_
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As an instruction cache optimization, these rearrange emitted object code so
|
||||||
|
* that the unlikely path is moved aside. See
|
||||||
|
* https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fexpect
|
||||||
|
*/
|
||||||
|
#define MONGO_likely(x) \
|
||||||
|
MONGO_COMPILER_IF_MSVC(bool(x)) \
|
||||||
|
MONGO_COMPILER_IF_GNUC(static_cast<bool>(__builtin_expect(static_cast<bool>(x), 1)))
|
||||||
|
#define MONGO_unlikely(x) \
|
||||||
|
MONGO_COMPILER_IF_MSVC(bool(x)) \
|
||||||
|
MONGO_COMPILER_IF_GNUC(static_cast<bool>(__builtin_expect(static_cast<bool>(x), 0)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `MONGO_COMPILER_DIAGNOSTIC_` macros locally control diagnostic settings.
|
||||||
* Example:
|
* Example:
|
||||||
* MONGO_COMPILER_DIAGNOSTIC_PUSH
|
* MONGO_COMPILER_DIAGNOSTIC_PUSH
|
||||||
* MONGO_COMPILER_DIAGNOSTIC_IGNORED_TRANSITIONAL("-Warray-bounds")
|
* MONGO_COMPILER_DIAGNOSTIC_IGNORED("-Wsome-warning")
|
||||||
* char buf[0];
|
* ...
|
||||||
* __builtin_strcpy(buf, "overflow");
|
|
||||||
* MONGO_COMPILER_DIAGNOSTIC_POP
|
* MONGO_COMPILER_DIAGNOSTIC_POP
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Allows issuing pragmas through macros. Arguments appear exactly as they would in a #pragma.
|
#define MONGO_COMPILER_DIAGNOSTIC_PUSH \
|
||||||
#define MONGO_COMPILER_PRAGMA(p) _Pragma(#p)
|
MONGO_COMPILER_IF_GCC(MONGO_COMPILER_PRAGMA(GCC diagnostic push)) \
|
||||||
|
MONGO_COMPILER_IF_CLANG(MONGO_COMPILER_PRAGMA(clang diagnostic push))
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#define MONGO_COMPILER_DIAGNOSTIC_POP \
|
||||||
#include "mongo/platform/compiler_msvc.h" // IWYU pragma: export
|
MONGO_COMPILER_IF_GCC(MONGO_COMPILER_PRAGMA(GCC diagnostic pop)) \
|
||||||
#elif defined(__GNUC__)
|
MONGO_COMPILER_IF_CLANG(MONGO_COMPILER_PRAGMA(clang diagnostic pop))
|
||||||
#include "mongo/platform/compiler_gcc.h" // IWYU pragma: export
|
|
||||||
#else
|
|
||||||
#error "Unsupported compiler family"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Define clang's has_feature macro for other compilers
|
/**
|
||||||
// See https://clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension
|
* Both GCC and clang can use this abstract macro, mostly as an implementation
|
||||||
#if !defined(__has_feature)
|
* detail. It's up to callers to know when GCC and clang disagree on the name of
|
||||||
#define __has_feature(x) 0
|
* the warning.
|
||||||
#endif
|
*/
|
||||||
|
#define MONGO_COMPILER_DIAGNOSTIC_IGNORED(w) \
|
||||||
|
MONGO_COMPILER_IF_GCC(MONGO_COMPILER_PRAGMA(GCC diagnostic ignored w)) \
|
||||||
|
MONGO_COMPILER_IF_CLANG(MONGO_COMPILER_PRAGMA(clang diagnostic ignored w))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO(SERVER-97447): We ignore these warnings on GCC 14 to facilitate
|
||||||
|
* transition to the v5 toolchain. They should be investigated more deeply by
|
||||||
|
* the teams owning each callsite.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_DIAGNOSTIC_IGNORED_TRANSITIONAL(w) \
|
||||||
|
MONGO_COMPILER_IF_GCC14(MONGO_COMPILER_DIAGNOSTIC_IGNORED(w))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We selectively ignore `-Wstringop-overread` on GCC 14 due to a known bug
|
||||||
|
* affecting `boost::container::small_vector`:
|
||||||
|
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108197.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_BOOST_SMALL_VECTOR \
|
||||||
|
MONGO_COMPILER_IF_GCC14(MONGO_COMPILER_DIAGNOSTIC_IGNORED("-Wstringop-overread"))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We selectively ignore `-Wstringop-overflow` on GCC 14 due to strong suspicion
|
||||||
|
* that they are false-positives. They involve an atomic read overflowing the
|
||||||
|
* destination, likely due to the compiler incorrectly believing they might be
|
||||||
|
* referencing a null pointer.
|
||||||
|
*/
|
||||||
|
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_ATOMIC_READ \
|
||||||
|
MONGO_COMPILER_IF_GCC14(MONGO_COMPILER_DIAGNOSTIC_IGNORED("-Wstringop-overflow"))
|
||||||
|
|
|
||||||
|
|
@ -1,149 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2018-present MongoDB, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the Server Side Public License, version 1,
|
|
||||||
* as published by MongoDB, Inc.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* Server Side Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the Server Side Public License
|
|
||||||
* along with this program. If not, see
|
|
||||||
* <http://www.mongodb.com/licensing/server-side-public-license>.
|
|
||||||
*
|
|
||||||
* As a special exception, the copyright holders give permission to link the
|
|
||||||
* code of portions of this program with the OpenSSL library under certain
|
|
||||||
* conditions as described in each individual source file and distribute
|
|
||||||
* linked combinations including the program with the OpenSSL library. You
|
|
||||||
* must comply with the Server Side Public License in all respects for
|
|
||||||
* all of the code used other than as permitted herein. If you modify file(s)
|
|
||||||
* with this exception, you may extend this exception to your version of the
|
|
||||||
* file(s), but you are not obligated to do so. If you do not wish to do so,
|
|
||||||
* delete this exception statement from your version. If you delete this
|
|
||||||
* exception statement from all source files in the program, then also delete
|
|
||||||
* it in the license file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compiler-specific implementations for gcc.
|
|
||||||
*
|
|
||||||
* Refer to mongo/platform/compiler.h for usage documentation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
// Annotating methods with [[lifetimebound]] allows the compiler to do some more lifetime checking
|
|
||||||
// (e.g., "returned value should not outlive *this") and emit warnings. See
|
|
||||||
// https://clang.llvm.org/docs/AttributeReference.html#lifetimebound
|
|
||||||
#if defined(__has_cpp_attribute) && __has_cpp_attribute(clang::lifetimebound)
|
|
||||||
#define MONGO_COMPILER_LIFETIME_BOUND [[clang::lifetimebound]]
|
|
||||||
#else
|
|
||||||
#define MONGO_COMPILER_LIFETIME_BOUND
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#if defined(__has_cpp_attribute) && __has_cpp_attribute(lifetimebound)
|
|
||||||
#define MONGO_COMPILER_LIFETIME_BOUND [[lifetimebound]]
|
|
||||||
#else
|
|
||||||
#define MONGO_COMPILER_LIFETIME_BOUND
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_COLD_FUNCTION __attribute__((__cold__))
|
|
||||||
#define MONGO_COMPILER_NORETURN __attribute__((__noreturn__, __cold__))
|
|
||||||
|
|
||||||
#define MONGO_WARN_UNUSED_RESULT_CLASS [[nodiscard]]
|
|
||||||
#define MONGO_WARN_UNUSED_RESULT_FUNCTION [[nodiscard]]
|
|
||||||
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALIGN_TYPE(ALIGNMENT) __attribute__((__aligned__(ALIGNMENT)))
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALIGN_VARIABLE(ALIGNMENT) __attribute__((__aligned__(ALIGNMENT)))
|
|
||||||
|
|
||||||
// NOTE(schwerin): These visibility and calling-convention macro definitions assume we're not using
|
|
||||||
// GCC/CLANG to target native Windows. If/when we decide to do such targeting, we'll need to change
|
|
||||||
// compiler flags on Windows to make sure we use an appropriate calling convention, and configure
|
|
||||||
// MONGO_COMPILER_API_EXPORT, MONGO_COMPILER_API_IMPORT and MONGO_COMPILER_API_CALLING_CONVENTION
|
|
||||||
// correctly. I believe "correctly" is the following:
|
|
||||||
//
|
|
||||||
// #ifdef _WIN32
|
|
||||||
// #define MONGO_COMIPLER_API_EXPORT __attribute__(( __dllexport__ ))
|
|
||||||
// #define MONGO_COMPILER_API_IMPORT __attribute__(( __dllimport__ ))
|
|
||||||
// #ifdef _M_IX86
|
|
||||||
// #define MONGO_COMPILER_API_CALLING_CONVENTION __attribute__((__cdecl__))
|
|
||||||
// #else
|
|
||||||
// #define MONGO_COMPILER_API_CALLING_CONVENTION
|
|
||||||
// #endif
|
|
||||||
// #else ... fall through to the definitions below.
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_API_EXPORT __attribute__((__visibility__("default")))
|
|
||||||
#define MONGO_COMPILER_API_IMPORT
|
|
||||||
#define MONGO_COMPILER_API_HIDDEN_FUNCTION __attribute__((visibility("hidden")))
|
|
||||||
#define MONGO_COMPILER_API_CALLING_CONVENTION
|
|
||||||
|
|
||||||
#define MONGO_likely(x) static_cast<bool>(__builtin_expect(static_cast<bool>(x), 1))
|
|
||||||
#define MONGO_unlikely(x) static_cast<bool>(__builtin_expect(static_cast<bool>(x), 0))
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALWAYS_INLINE [[gnu::always_inline]]
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_UNREACHABLE __builtin_unreachable()
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_NOINLINE [[gnu::noinline]]
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_RETURNS_NONNULL [[gnu::returns_nonnull]]
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_MALLOC [[gnu::malloc]]
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALLOC_SIZE(varindex) [[gnu::alloc_size(varindex)]]
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_NO_UNIQUE_ADDRESS [[no_unique_address]]
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_USED [[gnu::used]]
|
|
||||||
|
|
||||||
#if defined(__clang__)
|
|
||||||
#define MONGO_GSL_POINTER [[gsl::Pointer]]
|
|
||||||
#else
|
|
||||||
#define MONGO_GSL_POINTER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Both GCC and clang can use this abstract macro, mostly as an implementation detail. It's up to
|
|
||||||
// callers to know when GCC and clang disagree on the name of the warning.
|
|
||||||
#if defined(__clang__)
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_PUSH MONGO_COMPILER_PRAGMA(clang diagnostic push)
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_POP MONGO_COMPILER_PRAGMA(clang diagnostic pop)
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_IGNORED(w) MONGO_COMPILER_PRAGMA(clang diagnostic ignored w)
|
|
||||||
#else
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_PUSH MONGO_COMPILER_PRAGMA(GCC diagnostic push)
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_POP MONGO_COMPILER_PRAGMA(GCC diagnostic pop)
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_IGNORED(w) MONGO_COMPILER_PRAGMA(GCC diagnostic ignored w)
|
|
||||||
#endif // clang
|
|
||||||
|
|
||||||
#if !defined(__clang__) && __GNUC__ >= 14
|
|
||||||
|
|
||||||
// TODO(SERVER-97447): We ignore these warnings on GCC 14 to facilitate transition to the v5
|
|
||||||
// toolchain. They should be investigated more deeply by the teams owning each callsite.
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_IGNORED_TRANSITIONAL(w) MONGO_COMPILER_DIAGNOSTIC_IGNORED(w)
|
|
||||||
|
|
||||||
// We selectively ignore -Wstringop-overread on GCC 14 due to a known bug affecting
|
|
||||||
// boost::container::small_vector: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108197.
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_BOOST_SMALL_VECTOR \
|
|
||||||
MONGO_COMPILER_DIAGNOSTIC_IGNORED("-Wstringop-overread")
|
|
||||||
|
|
||||||
// We selectively ignore -Wstringop-overflow on GCC 14 due to strong suspicion that they are
|
|
||||||
// false-positives. They involve an atomic read overflowing the destination, likely due to the
|
|
||||||
// compiler incorrectly believing they might be referencing a NULL pointer.
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_ATOMIC_READ \
|
|
||||||
MONGO_COMPILER_DIAGNOSTIC_IGNORED("-Wstringop-overflow")
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_IGNORED_TRANSITIONAL(w)
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_BOOST_SMALL_VECTOR
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_ATOMIC_READ
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2018-present MongoDB, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the Server Side Public License, version 1,
|
|
||||||
* as published by MongoDB, Inc.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* Server Side Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the Server Side Public License
|
|
||||||
* along with this program. If not, see
|
|
||||||
* <http://www.mongodb.com/licensing/server-side-public-license>.
|
|
||||||
*
|
|
||||||
* As a special exception, the copyright holders give permission to link the
|
|
||||||
* code of portions of this program with the OpenSSL library under certain
|
|
||||||
* conditions as described in each individual source file and distribute
|
|
||||||
* linked combinations including the program with the OpenSSL library. You
|
|
||||||
* must comply with the Server Side Public License in all respects for
|
|
||||||
* all of the code used other than as permitted herein. If you modify file(s)
|
|
||||||
* with this exception, you may extend this exception to your version of the
|
|
||||||
* file(s), but you are not obligated to do so. If you do not wish to do so,
|
|
||||||
* delete this exception statement from your version. If you delete this
|
|
||||||
* exception statement from all source files in the program, then also delete
|
|
||||||
* it in the license file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compiler-specific implementations for MSVC.
|
|
||||||
*
|
|
||||||
* Refer to mongo/platform/compiler.h for usage documentation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
|
|
||||||
// Microsoft seems opposed to implementing this:
|
|
||||||
// https://connect.microsoft.com/VisualStudio/feedback/details/804542
|
|
||||||
#define MONGO_COMPILER_COLD_FUNCTION
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_NORETURN __declspec(noreturn)
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALIGN_TYPE(ALIGNMENT) __declspec(align(ALIGNMENT))
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALIGN_VARIABLE(ALIGNMENT) __declspec(align(ALIGNMENT))
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_API_EXPORT __declspec(dllexport)
|
|
||||||
#define MONGO_COMPILER_API_IMPORT __declspec(dllimport)
|
|
||||||
#define MONGO_COMPILER_API_HIDDEN_FUNCTION
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_NOINLINE __declspec(noinline)
|
|
||||||
|
|
||||||
#define MONGO_WARN_UNUSED_RESULT_CLASS
|
|
||||||
#define MONGO_WARN_UNUSED_RESULT_FUNCTION
|
|
||||||
|
|
||||||
#ifdef _M_IX86
|
|
||||||
// 32-bit x86 supports multiple of calling conventions. We build supporting the cdecl convention
|
|
||||||
// (most common). By labeling our exported and imported functions as such, we do a small favor to
|
|
||||||
// 32-bit Windows developers.
|
|
||||||
#define MONGO_COMPILER_API_CALLING_CONVENTION __cdecl
|
|
||||||
#else
|
|
||||||
#define MONGO_COMPILER_API_CALLING_CONVENTION
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MONGO_likely(x) bool(x)
|
|
||||||
#define MONGO_unlikely(x) bool(x)
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALWAYS_INLINE __forceinline
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_UNREACHABLE __assume(false)
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_RETURNS_NONNULL
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_MALLOC __declspec(restrict)
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_ALLOC_SIZE(varindex)
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_USED
|
|
||||||
|
|
||||||
#define MONGO_GSL_POINTER
|
|
||||||
|
|
||||||
// Introduced in Visual Studio 2022 17.7
|
|
||||||
// See: https://learn.microsoft.com/en-us/cpp/code-quality/c26815?view=msvc-170
|
|
||||||
#if _MSC_VER >= 1937
|
|
||||||
#define MONGO_COMPILER_LIFETIME_BOUND [[msvc::lifetimebound]]
|
|
||||||
#else
|
|
||||||
#define MONGO_COMPILER_LIFETIME_BOUND
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_PUSH
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_POP
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_IGNORED_TRANSITIONAL(w)
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_BOOST_SMALL_VECTOR
|
|
||||||
#define MONGO_COMPILER_DIAGNOSTIC_WORKAROUND_ATOMIC_READ
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
#include "mongo/base/status.h"
|
#include "mongo/base/status.h"
|
||||||
#include "mongo/db/operation_context.h"
|
#include "mongo/db/operation_context.h"
|
||||||
#include "mongo/logv2/log.h"
|
#include "mongo/logv2/log.h"
|
||||||
#include "mongo/platform/compiler_gcc.h"
|
#include "mongo/platform/compiler.h"
|
||||||
#include "mongo/util/assert_util.h"
|
#include "mongo/util/assert_util.h"
|
||||||
#include "mongo/util/errno_util.h"
|
#include "mongo/util/errno_util.h"
|
||||||
#include "mongo/util/fail_point.h"
|
#include "mongo/util/fail_point.h"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue