// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // This file defines common macros that are used in protobuf. // // To hide these definitions from the outside world (and to prevent collisions // if more than one version of protobuf is #included in the same project) you // must follow this pattern when #including port_def.inc in a header file: // // #include "other_header.h" // #include "message.h" // // etc. // // #include "port_def.inc" // MUST be last header included // // // Definitions for this header. // // #include "port_undef.inc" // // This is a textual header with no include guard, because we want to // detect/prohibit anytime it is #included twice without a corresponding // #undef. // The definitions in this file are intended to be portable across Clang, // GCC, and MSVC. Function-like macros are usable without an #ifdef guard. // Syntax macros (for example, attributes) are always defined, although // they may be empty. // // Some definitions rely on the NDEBUG macro and/or (in MSVC) _DEBUG: // - https://en.cppreference.com/w/c/error/assert // - https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros#microsoft-specific-predefined-macros // // References for predefined macros: // - Standard: https://en.cppreference.com/w/cpp/preprocessor/replace // - Clang: https://clang.llvm.org/docs/LanguageExtensions.html // (see also GCC predefined macros) // - GCC: https://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html // - MSVC: https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros // - Interactive (Clang/GCC only): https://www.compiler-explorer.com/z/hc6jKd3sj // // References for attributes (and extension attributes): // - Standard: https://en.cppreference.com/w/cpp/language/attributes // - Clang: https://clang.llvm.org/docs/AttributeReference.html // - GCC: https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html // (see Clang attribute docs as well) // // References for standard C++ language conformance (and minimum versions): // - Clang: https://clang.llvm.org/cxx_status.html // - GCC: https://gcc.gnu.org/projects/cxx-status.html // - MSVC: https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance // // Historical release notes (which can help to determine minimum versions): // - Clang: https://releases.llvm.org/ // - GCC: https://gcc.gnu.org/releases.html // - MSVC: https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-history // https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2017-relnotes-history // Portable fallbacks for C++20 feature test macros: // https://en.cppreference.com/w/cpp/feature_test #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #define PROTOBUF_has_cpp_attribute_DEFINED_ #endif // Portable fallback for Clang's __has_feature macro: // https://clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension #ifndef __has_feature #define __has_feature(x) 0 #define PROTOBUF_has_feature_DEFINED_ #endif // Portable fallback for Clang's __has_warning macro: #ifndef __has_warning #define __has_warning(x) 0 #define PROTOBUF_has_warning_DEFINED_ #endif // Portable fallbacks for the __has_attribute macro (GCC and Clang): // https://clang.llvm.org/docs/LanguageExtensions.html#has-attribute // https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fattribute.html #ifndef __has_attribute #define __has_attribute(x) 0 #define PROTOBUF_has_attribute_DEFINED_ #endif // Portable fallback for __has_builtin (GCC and Clang): // https://clang.llvm.org/docs/LanguageExtensions.html#has-builtin // https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fbuiltin.html #ifndef __has_builtin #define __has_builtin(x) 0 #define PROTOBUF_has_builtin_DEFINED_ #endif // Portable PROTOBUF_BUILTIN_BSWAPxx definitions // Code must check for availability, e.g.: `defined(PROTOBUF_BUILTIN_BSWAP32)` #ifdef PROTOBUF_BUILTIN_BSWAP16 #error PROTOBUF_BUILTIN_BSWAP16 was previously defined #endif #ifdef PROTOBUF_BUILTIN_BSWAP32 #error PROTOBUF_BUILTIN_BSWAP32 was previously defined #endif #ifdef PROTOBUF_BUILTIN_BSWAP64 #error PROTOBUF_BUILTIN_BSWAP64 was previously defined #endif #if defined(__GNUC__) || __has_builtin(__builtin_bswap16) #define PROTOBUF_BUILTIN_BSWAP16(x) __builtin_bswap16(x) #endif #if defined(__GNUC__) || __has_builtin(__builtin_bswap32) #define PROTOBUF_BUILTIN_BSWAP32(x) __builtin_bswap32(x) #endif #if defined(__GNUC__) || __has_builtin(__builtin_bswap64) #define PROTOBUF_BUILTIN_BSWAP64(x) __builtin_bswap64(x) #endif // Portable check for GCC minimum version: // https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html #if defined(__GNUC__) && defined(__GNUC_MINOR__) \ && defined(__GNUC_PATCHLEVEL__) # define PROTOBUF_GNUC_MIN(x, y) \ (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) #else # define PROTOBUF_GNUC_MIN(x, y) 0 #endif // Portable check for MSVC minimum version: // https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros #if defined(_MSC_VER) #define PROTOBUF_MSC_VER_MIN(x) (_MSC_VER >= x) #else #define PROTOBUF_MSC_VER_MIN(x) 0 #endif // Portable check for minimum C++ language version: // https://en.cppreference.com/w/cpp/preprocessor/replace // https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros #if !defined(_MSVC_LANG) #define PROTOBUF_CPLUSPLUS_MIN(x) (__cplusplus >= x) #else #define PROTOBUF_CPLUSPLUS_MIN(x) (_MSVC_LANG >= x) #endif // Future versions of protobuf will include breaking changes to some APIs. // This macro can be set to enable these API changes ahead of time, so that // user code can be updated before upgrading versions of protobuf. // PROTOBUF_FUTURE_FINAL is used on classes that are historically not marked as // final, but that may be marked final in future (breaking) releases. // #define PROTOBUF_FUTURE_BREAKING_CHANGES 1 // #define PROTOBUF_FUTURE_FINAL final #define PROTOBUF_FUTURE_FINAL #ifdef PROTOBUF_VERSION #error PROTOBUF_VERSION was previously defined #endif #define PROTOBUF_VERSION 3021012 #ifdef PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC #error PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC was previously defined #endif #define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC 3021000 #ifdef PROTOBUF_MIN_PROTOC_VERSION #error PROTOBUF_MIN_PROTOC_VERSION was previously defined #endif #define PROTOBUF_MIN_PROTOC_VERSION 3021000 #ifdef PROTOBUF_VERSION_SUFFIX #error PROTOBUF_VERSION_SUFFIX was previously defined #endif #define PROTOBUF_VERSION_SUFFIX "" #if defined(PROTOBUF_NAMESPACE) || defined(PROTOBUF_NAMESPACE_ID) #error PROTOBUF_NAMESPACE or PROTOBUF_NAMESPACE_ID was previously defined #endif #define PROTOBUF_NAMESPACE "google::protobuf" #define PROTOBUF_NAMESPACE_ID google::protobuf #define PROTOBUF_NAMESPACE_OPEN \ namespace google { \ namespace protobuf { #define PROTOBUF_NAMESPACE_CLOSE \ } /* namespace protobuf */ \ } /* namespace google */ #ifdef PROTOBUF_ALWAYS_INLINE #error PROTOBUF_ALWAYS_INLINE was previously defined #endif // For functions we want to force inline. #if defined(PROTOBUF_NO_INLINE) # define PROTOBUF_ALWAYS_INLINE #elif PROTOBUF_GNUC_MIN(3, 1) # define PROTOBUF_ALWAYS_INLINE __attribute__((always_inline)) #elif defined(_MSC_VER) # define PROTOBUF_ALWAYS_INLINE __forceinline #else # define PROTOBUF_ALWAYS_INLINE #endif #ifdef PROTOBUF_NDEBUG_INLINE #error PROTOBUF_NDEBUG_INLINE was previously defined #endif // Avoid excessive inlining in non-optimized builds. Without other optimizations // the inlining is not going to provide benefits anyway and the huge resulting // functions, especially in the proto-generated serialization functions, produce // stack frames so large that many tests run into stack overflows (b/32192897). #if defined(NDEBUG) || (defined(_MSC_VER) && !defined(_DEBUG)) # define PROTOBUF_NDEBUG_INLINE PROTOBUF_ALWAYS_INLINE #else # define PROTOBUF_NDEBUG_INLINE #endif // Note that PROTOBUF_NOINLINE is an attribute applied to functions, to prevent // them from being inlined by the compiler. This is different from // PROTOBUF_NO_INLINE, which is a user-supplied macro that disables forced // inlining by PROTOBUF_(ALWAYS|NDEBUG)_INLINE. #ifdef PROTOBUF_NOINLINE #error PROTOBUF_NOINLINE was previously defined #endif #if PROTOBUF_GNUC_MIN(3, 1) # define PROTOBUF_NOINLINE __attribute__((noinline)) #elif defined(_MSC_VER) // Seems to have been around since at least Visual Studio 2005 # define PROTOBUF_NOINLINE __declspec(noinline) #endif #ifdef PROTOBUF_MUSTTAIL #error PROTOBUF_MUSTTAIL was previously defined #endif #ifdef PROTOBUF_TAILCALL #error PROTOBUF_TAILCALL was previously defined #endif #if __has_cpp_attribute(clang::musttail) && !defined(__arm__) && \ !defined(_ARCH_PPC) && !defined(__wasm__) && \ !(defined(_MSC_VER) && defined(_M_IX86)) && \ !(defined(__NDK_MAJOR__) && __NDK_MAJOR <= 24) # ifndef PROTO2_OPENSOURCE // Compilation fails on ARM32: b/195943306 // Compilation fails on powerpc64le: b/187985113 // Compilation fails on X86 Windows: // https://github.com/llvm/llvm-project/issues/53271 # endif #define PROTOBUF_MUSTTAIL [[clang::musttail]] #define PROTOBUF_TAILCALL true #else #define PROTOBUF_MUSTTAIL #define PROTOBUF_TAILCALL false #endif #ifdef PROTOBUF_EXCLUSIVE_LOCKS_REQUIRED #error PROTOBUF_EXCLUSIVE_LOCKS_REQUIRED was previously defined #endif #if __has_attribute(exclusive_locks_required) #define PROTOBUF_EXCLUSIVE_LOCKS_REQUIRED(...) \ __attribute__((exclusive_locks_required(__VA_ARGS__))) #else #define PROTOBUF_EXCLUSIVE_LOCKS_REQUIRED(...) #endif #ifdef PROTOBUF_NO_THREAD_SAFETY_ANALYSIS #error PROTOBUF_NO_THREAD_SAFETY_ANALYSIS was previously defined #endif #if __has_attribute(no_thread_safety_analysis) #define PROTOBUF_NO_THREAD_SAFETY_ANALYSIS \ __attribute__((no_thread_safety_analysis)) #else #define PROTOBUF_NO_THREAD_SAFETY_ANALYSIS #endif #ifdef PROTOBUF_GUARDED_BY #error PROTOBUF_GUARDED_BY was previously defined #endif #if __has_attribute(guarded_by) #define PROTOBUF_GUARDED_BY(x) __attribute__((guarded_by(x))) #else #define PROTOBUF_GUARDED_BY(x) #endif #ifdef PROTOBUF_LOCKS_EXCLUDED #error PROTOBUF_LOCKS_EXCLUDED was previously defined #endif #if __has_attribute(locks_excluded) #define PROTOBUF_LOCKS_EXCLUDED(...) \ __attribute__((locks_excluded(__VA_ARGS__))) #else #define PROTOBUF_LOCKS_EXCLUDED(...) #endif #ifdef PROTOBUF_COLD #error PROTOBUF_COLD was previously defined #endif #if __has_attribute(cold) || PROTOBUF_GNUC_MIN(4, 3) # define PROTOBUF_COLD __attribute__((cold)) #else # define PROTOBUF_COLD #endif #ifdef PROTOBUF_SECTION_VARIABLE #error PROTOBUF_SECTION_VARIABLE was previously defined #endif #if (__has_attribute(section) || defined(__GNUC__)) && defined(__ELF__) // Place a variable in the given ELF section. # define PROTOBUF_SECTION_VARIABLE(x) __attribute__((section(#x))) #else # define PROTOBUF_SECTION_VARIABLE(x) #endif #if defined(PROTOBUF_DEPRECATED) #error PROTOBUF_DEPRECATED was previously defined #endif #if defined(PROTOBUF_DEPRECATED_MSG) #error PROTOBUF_DEPRECATED_MSG was previously defined #endif #if __has_attribute(deprecated) || PROTOBUF_GNUC_MIN(3, 0) # define PROTOBUF_DEPRECATED __attribute__((deprecated)) # define PROTOBUF_DEPRECATED_MSG(msg) __attribute__((deprecated(msg))) #elif defined(_MSC_VER) # define PROTOBUF_DEPRECATED __declspec(deprecated) # define PROTOBUF_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) #else # define PROTOBUF_DEPRECATED # define PROTOBUF_DEPRECATED_MSG(msg) #endif #if defined(PROTOBUF_DEPRECATED_ENUM) #error PROTOBUF_DEPRECATED_ENUM was previously defined #endif #if defined(__clang__) || PROTOBUF_GNUC_MIN(6, 0) // https://gcc.gnu.org/gcc-6/changes.html # define PROTOBUF_DEPRECATED_ENUM __attribute__((deprecated)) #else # define PROTOBUF_DEPRECATED_ENUM #endif #ifdef PROTOBUF_FUNC_ALIGN #error PROTOBUF_FUNC_ALIGN was previously defined #endif #if __has_attribute(aligned) || PROTOBUF_GNUC_MIN(4, 3) #define PROTOBUF_FUNC_ALIGN(bytes) __attribute__((aligned(bytes))) #else #define PROTOBUF_FUNC_ALIGN(bytes) #endif #ifdef PROTOBUF_RETURNS_NONNULL #error PROTOBUF_RETURNS_NONNULL was previously defined #endif #if __has_attribute(returns_nonnull) || PROTOBUF_GNUC_MIN(4, 9) #define PROTOBUF_RETURNS_NONNULL __attribute__((returns_nonnull)) #else #define PROTOBUF_RETURNS_NONNULL #endif #ifdef PROTOBUF_ATTRIBUTE_REINITIALIZES #error PROTOBUF_ATTRIBUTE_REINITIALIZES was previously defined #endif #if __has_cpp_attribute(clang::reinitializes) #define PROTOBUF_ATTRIBUTE_REINITIALIZES [[clang::reinitializes]] #else #define PROTOBUF_ATTRIBUTE_REINITIALIZES #endif // The minimum library version which works with the current version of the // headers. #define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 3021000 #ifdef PROTOBUF_RTTI #error PROTOBUF_RTTI was previously defined #endif #if defined(GOOGLE_PROTOBUF_NO_RTTI) && GOOGLE_PROTOBUF_NO_RTTI // A user-provided definition GOOGLE_PROTOBUF_NO_RTTI=1 disables RTTI. #define PROTOBUF_RTTI 0 #elif defined(__cpp_rtti) // https://en.cppreference.com/w/cpp/feature_test #define PROTOBUF_RTTI 1 #elif __has_feature(cxx_rtti) // https://clang.llvm.org/docs/LanguageExtensions.html#c-rtti #define PROTOBUF_RTTI 1 #elif defined(__GXX_RTTI) // https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html #define PROTOBUF_RTTI 1 #elif defined(_CPPRTTI) // https://docs.microsoft.com/en-us/cpp/build/reference/gr-enable-run-time-type-information #define PROTOBUF_RTTI 1 #else #define PROTOBUF_RTTI 0 #endif // Returns the offset of the given field within the given aggregate type. // This is equivalent to the ANSI C offsetof() macro. However, according // to the C++ standard, offsetof() only works on POD types, and GCC // enforces this requirement with a warning. In practice, this rule is // unnecessarily strict; there is probably no compiler or platform on // which the offsets of the direct fields of a class are non-constant. // Fields inherited from superclasses *can* have non-constant offsets, // but that's not what this macro will be used for. #ifdef PROTOBUF_FIELD_OFFSET #error PROTOBUF_FIELD_OFFSET was previously defined #endif #if defined(__clang__) // For Clang we use __builtin_offsetof() and suppress the warning, // to avoid Control Flow Integrity and UBSan vptr sanitizers from // crashing while trying to validate the invalid reinterpret_casts. #define PROTOBUF_FIELD_OFFSET(TYPE, FIELD) \ _Pragma("clang diagnostic push") \ _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \ __builtin_offsetof(TYPE, FIELD) \ _Pragma("clang diagnostic pop") #elif PROTOBUF_GNUC_MIN(4, 8) #define PROTOBUF_FIELD_OFFSET(TYPE, FIELD) __builtin_offsetof(TYPE, FIELD) #else // defined(__clang__) // Note that we calculate relative to the pointer value 16 here since if we // just use zero, GCC complains about dereferencing a NULL pointer. We // choose 16 rather than some other number just in case the compiler would // be confused by an unaligned pointer. #define PROTOBUF_FIELD_OFFSET(TYPE, FIELD) \ static_cast< ::uint32_t>(reinterpret_cast( \ &reinterpret_cast(16)->FIELD) - \ reinterpret_cast(16)) #endif #ifdef PROTOBUF_EXPORT #error PROTOBUF_EXPORT was previously defined #endif #if defined(PROTOBUF_USE_DLLS) && defined(_MSC_VER) # if defined(LIBPROTOBUF_EXPORTS) # define PROTOBUF_EXPORT __declspec(dllexport) # define PROTOBUF_EXPORT_TEMPLATE_DECLARE # define PROTOBUF_EXPORT_TEMPLATE_DEFINE __declspec(dllexport) # else # define PROTOBUF_EXPORT __declspec(dllimport) # define PROTOBUF_EXPORT_TEMPLATE_DECLARE # define PROTOBUF_EXPORT_TEMPLATE_DEFINE __declspec(dllimport) # endif // defined(LIBPROTOBUF_EXPORTS) #elif defined(PROTOBUF_USE_DLLS) && defined(LIBPROTOBUF_EXPORTS) # define PROTOBUF_EXPORT __attribute__((visibility("default"))) # define PROTOBUF_EXPORT_TEMPLATE_DECLARE __attribute__((visibility("default"))) # define PROTOBUF_EXPORT_TEMPLATE_DEFINE #else # define PROTOBUF_EXPORT # define PROTOBUF_EXPORT_TEMPLATE_DECLARE # define PROTOBUF_EXPORT_TEMPLATE_DEFINE #endif #ifdef PROTOC_EXPORT #error PROTOC_EXPORT was previously defined #endif #if defined(PROTOBUF_USE_DLLS) && defined(_MSC_VER) # if defined(LIBPROTOC_EXPORTS) # define PROTOC_EXPORT __declspec(dllexport) # else # define PROTOC_EXPORT __declspec(dllimport) # endif // defined(LIBPROTOC_EXPORTS) #elif defined(PROTOBUF_USE_DLLS) && defined(LIBPROTOC_EXPORTS) # define PROTOC_EXPORT __attribute__((visibility("default"))) #else # define PROTOC_EXPORT #endif #if defined(PROTOBUF_PREDICT_TRUE) || defined(PROTOBUF_PREDICT_FALSE) #error PROTOBUF_PREDICT_(TRUE|FALSE) was previously defined #endif #if PROTOBUF_GNUC_MIN(3, 0) # define PROTOBUF_PREDICT_TRUE(x) (__builtin_expect(false || (x), true)) # define PROTOBUF_PREDICT_FALSE(x) (__builtin_expect(false || (x), false)) #else # define PROTOBUF_PREDICT_TRUE(x) (x) # define PROTOBUF_PREDICT_FALSE(x) (x) #endif #ifdef PROTOBUF_NODISCARD #error PROTOBUF_NODISCARD was previously defined #endif #if __has_cpp_attribute(nodiscard) && PROTOBUF_CPLUSPLUS_MIN(201703L) #define PROTOBUF_NODISCARD [[nodiscard]] #elif __has_attribute(warn_unused_result) || PROTOBUF_GNUC_MIN(4, 8) #define PROTOBUF_NODISCARD __attribute__((warn_unused_result)) #else #define PROTOBUF_NODISCARD #endif // Enable all stable experiments if this flag is set. This allows us to group // all of these experiments under a single build flag, which can be enabled in // the protobuf.stable-experiments TAP project. #ifdef PROTOBUF_ENABLE_STABLE_EXPERIMENTS #define PROTOBUF_FORCE_MESSAGE_OWNED_ARENA #endif // !PROTOBUF_ENABLE_STABLE_EXPERIMENTS #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE #error PROTOBUF_FORCE_COPY_IN_RELEASE was previously defined #endif #ifdef PROTOBUF_FORCE_COPY_IN_SWAP #error PROTOBUF_FORCE_COPY_IN_SWAP was previously defined #endif #ifdef PROTOBUF_FORCE_COPY_IN_MOVE #error PROTOBUF_FORCE_COPY_IN_MOVE was previously defined #endif #ifdef PROTOBUF_FORCE_RESET_IN_CLEAR #error PROTOBUF_FORCE_RESET_IN_CLEAR was previously defined #endif // Force copy the default string to a string field so that non-optimized builds // have harder-to-rely-on address stability. #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING #error PROTOBUF_FORCE_COPY_DEFAULT_STRING was previously defined #endif #ifdef PROTOBUF_FALLTHROUGH_INTENDED #error PROTOBUF_FALLTHROUGH_INTENDED was previously defined #endif #if __has_cpp_attribute(fallthrough) #define PROTOBUF_FALLTHROUGH_INTENDED [[fallthrough]] #elif __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") #define PROTOBUF_FALLTHROUGH_INTENDED [[clang::fallthrough]] #elif PROTOBUF_GNUC_MIN(7, 0) #define PROTOBUF_FALLTHROUGH_INTENDED [[gnu::fallthrough]] #else #define PROTOBUF_FALLTHROUGH_INTENDED #endif // PROTOBUF_ASSUME(pred) tells the compiler that it can assume pred is true. To // be safe, we also validate the assumption with a GOOGLE_DCHECK in unoptimized // builds. The macro does not do anything useful if the compiler does not // support __builtin_assume. #ifdef PROTOBUF_ASSUME #error PROTOBUF_ASSUME was previously defined #endif #if __has_builtin(__builtin_assume) #define PROTOBUF_ASSUME(pred) \ GOOGLE_DCHECK(pred); \ __builtin_assume(pred) #else #define PROTOBUF_ASSUME(pred) GOOGLE_DCHECK(pred) #endif // Specify memory alignment for structs, classes, etc. // Use like: // class PROTOBUF_ALIGNAS(16) MyClass { ... } // PROTOBUF_ALIGNAS(16) int array[4]; // // In most places you can use the C++11 keyword "alignas", which is preferred. // // But compilers have trouble mixing __attribute__((...)) syntax with // alignas(...) syntax. // // Doesn't work in clang or gcc: // struct alignas(16) __attribute__((packed)) S { char c; }; // Works in clang but not gcc: // struct __attribute__((packed)) alignas(16) S2 { char c; }; // Works in clang and gcc: // struct alignas(16) S3 { char c; } __attribute__((packed)); // // There are also some attributes that must be specified *before* a class // definition: visibility (used for exporting functions/classes) is one of // these attributes. This means that it is not possible to use alignas() with a // class that is marked as exported. #ifdef PROTOBUF_ALIGNAS #error PROTOBUF_ALIGNAS was previously defined #endif #if defined(_MSC_VER) #define PROTOBUF_ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) #elif PROTOBUF_GNUC_MIN(3, 0) #define PROTOBUF_ALIGNAS(byte_alignment) \ __attribute__((aligned(byte_alignment))) #else #define PROTOBUF_ALIGNAS(byte_alignment) alignas(byte_alignment) #endif #ifdef PROTOBUF_FINAL #error PROTOBUF_FINAL was previously defined #endif #define PROTOBUF_FINAL final #ifdef PROTOBUF_THREAD_LOCAL #error PROTOBUF_THREAD_LOCAL was previously defined #endif #if defined(_MSC_VER) #define PROTOBUF_THREAD_LOCAL __declspec(thread) #else #define PROTOBUF_THREAD_LOCAL __thread #endif // TODO(b/228173843): cleanup PROTOBUF_LITTLE_ENDIAN in various 3p forks. #if (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) #define PROTOBUF_LITTLE_ENDIAN 1 #ifdef PROTOBUF_BIG_ENDIAN #error Conflicting PROTOBUF_BIG_ENDIAN was previously defined #endif #elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define PROTOBUF_BIG_ENDIAN 1 #elif defined(_WIN32) || defined(__x86_64__) || defined(__aarch64__) #define PROTOBUF_LITTLE_ENDIAN 1 #else #error "endian detection failed for current compiler" #endif // For enabling message owned arena, one major blocker is semantic change from // moving to copying when there is ownership transfer (e.g., move ctor, swap, // set allocated, release). This change not only causes performance regression // but also breaks users code (e.g., dangling reference). For top-level // messages, since it owns the arena, we can mitigate the issue by transferring // ownership of arena. However, we cannot do that for nested messages. In order // to tell how many usages of nested messages affected by message owned arena, // we need to simulate the arena ownership. // This experiment is purely for the purpose of gathering data. All code guarded // by this flag is supposed to be removed after this experiment. #define PROTOBUF_MESSAGE_OWNED_ARENA_EXPERIMENT #ifdef PROTOBUF_CONSTINIT #error PROTOBUF_CONSTINIT was previously defined #endif #if defined(__cpp_constinit) && !defined(_MSC_VER) #define PROTOBUF_CONSTINIT constinit #define PROTOBUF_CONSTEXPR constexpr // Some older Clang versions incorrectly raise an error about // constant-initializing weak default instance pointers. Versions 12.0 and // higher seem to work, except that XCode 12.5.1 shows the error even though it // uses Clang 12.0.5. // Clang-cl on Windows raises error also. #elif !defined(_MSC_VER) && __has_cpp_attribute(clang::require_constant_initialization) && \ ((defined(__APPLE__) && __clang_major__ >= 13) || \ (!defined(__APPLE__) && __clang_major__ >= 12)) #define PROTOBUF_CONSTINIT [[clang::require_constant_initialization]] #define PROTOBUF_CONSTEXPR constexpr #elif PROTOBUF_GNUC_MIN(12, 2) #define PROTOBUF_CONSTINIT __constinit #define PROTOBUF_CONSTEXPR constexpr // MSVC 17 currently seems to raise an error about constant-initialized pointers. #elif defined(_MSC_VER) && _MSC_VER >= 1930 #define PROTOBUF_CONSTINIT #define PROTOBUF_CONSTEXPR constexpr #else #define PROTOBUF_CONSTINIT #define PROTOBUF_CONSTEXPR #endif // Some globals with an empty non-trivial destructor are annotated with // no_destroy for performance reasons. It reduces the cost of these globals in // non-opt mode and under sanitizers. #ifdef PROTOBUF_ATTRIBUTE_NO_DESTROY #error PROTOBUF_ATTRIBUTE_NO_DESTROY was previously defined #endif #if __has_cpp_attribute(clang::no_destroy) #define PROTOBUF_ATTRIBUTE_NO_DESTROY [[clang::no_destroy]] #else #define PROTOBUF_ATTRIBUTE_NO_DESTROY #endif // Force clang to always emit complete debug info for a type. // Clang uses constructor homing to determine when to emit debug info for a // type. If the constructor of a type is never used, which can happen in some // cases where member variables are constructed in place for optimization // purposes (see b/208803175 for an example), the type will have incomplete // debug info unless this attribute is used. #ifdef PROTOBUF_ATTRIBUTE_STANDALONE_DEBUG #error PROTOBUF_ATTRIBUTE_STANDALONE_DEBUG was previously defined #endif #if __has_cpp_attribute(clang::standalone_debug) #define PROTOBUF_ATTRIBUTE_STANDALONE_DEBUG [[clang::standalone_debug]] #else #define PROTOBUF_ATTRIBUTE_STANDALONE_DEBUG #endif // Protobuf extensions and reflection require registration of the protos linked // in the binary. Not until everything is registered does the runtime have a // complete view on all protos. When code is using reflection or extensions // in between registration calls this can lead to surprising behavior. By // having the registration run first we mitigate this scenario. // Highest priority is 101. We use 102 for registration, to allow code that // really wants to higher priority to still beat us. Some initialization happens // at higher priority, though, since it is needed before registration. #ifdef PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 #error PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 was previously defined #endif #ifdef PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 #error PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 was previously defined #endif #if PROTOBUF_GNUC_MIN(3, 0) && (!defined(__APPLE__) || defined(__clang__)) && \ !((defined(sun) || defined(__sun)) && \ (defined(__SVR4) || defined(__svr4__))) #define PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 __attribute__((init_priority((101)))) #define PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 __attribute__((init_priority((102)))) #else #define PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 #define PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 #endif #ifdef PROTOBUF_PRAGMA_INIT_SEG #error PROTOBUF_PRAGMA_INIT_SEG was previously defined #endif #ifdef _MSC_VER #define PROTOBUF_PRAGMA_INIT_SEG __pragma(init_seg(lib)) #else #define PROTOBUF_PRAGMA_INIT_SEG #endif #ifdef PROTOBUF_ATTRIBUTE_WEAK #error PROTOBUF_ATTRIBUTE_WEAK was previously defined #endif #if __has_attribute(weak) && \ !defined(__APPLE__) && \ (!defined(_WIN32) || __clang_major__ < 9) && \ !defined(__MINGW32__) #define PROTOBUF_ATTRIBUTE_WEAK __attribute__((weak)) #define PROTOBUF_HAVE_ATTRIBUTE_WEAK 1 #else #define PROTOBUF_ATTRIBUTE_WEAK #define PROTOBUF_HAVE_ATTRIBUTE_WEAK 0 #endif // Macros to detect sanitizers. #ifdef PROTOBUF_ASAN #error PROTOBUF_ASAN was previously defined #endif #ifdef PROTOBUF_MSAN #error PROTOBUF_MSAN was previously defined #endif #ifdef PROTOBUF_TSAN #error PROTOBUF_TSAN was previously defined #endif #if defined(__clang__) # if __has_feature(address_sanitizer) # define PROTOBUF_ASAN 1 # endif # if __has_feature(thread_sanitizer) # define PROTOBUF_TSAN 1 # endif # if __has_feature(memory_sanitizer) # define PROTOBUF_MSAN 1 # endif #elif PROTOBUF_GNUC_MIN(3, 0) // Double-guard is needed for -Wundef: # ifdef __SANITIZE_ADDRESS__ # if __SANITIZE_ADDRESS__ # define PROTOBUF_ASAN 1 # endif # endif # ifdef __SANITIZE_THREAD__ # if __SANITIZE_THREAD__ # define PROTOBUF_TSAN 1 # endif # endif #endif // Tail call table-driven parsing can be enabled by defining // PROTOBUF_EXPERIMENTAL_USE_TAIL_CALL_TABLE_PARSER at compilation time. Note // that this macro is for small-scale testing only, and is not supported. #ifdef PROTOBUF_TAIL_CALL_TABLE_PARSER_ENABLED #error PROTOBUF_TAIL_CALL_TABLE_PARSER_ENABLED was previously declared #endif #if defined(PROTOBUF_EXPERIMENTAL_USE_TAIL_CALL_TABLE_PARSER) #define PROTOBUF_TAIL_CALL_TABLE_PARSER_ENABLED 1 #endif #define PROTOBUF_TC_PARAM_DECL \ ::google::protobuf::MessageLite *msg, const char *ptr, \ ::google::protobuf::internal::ParseContext *ctx, \ const ::google::protobuf::internal::TcParseTableBase *table, \ uint64_t hasbits, ::google::protobuf::internal::TcFieldData data #ifdef PROTOBUF_UNUSED #error PROTOBUF_UNUSED was previously defined #endif #if __has_cpp_attribute(maybe_unused) || \ (PROTOBUF_MSC_VER_MIN(1911) && PROTOBUF_CPLUSPLUS_MIN(201703L)) #define PROTOBUF_UNUSED [[maybe_unused]] #elif __has_attribute(unused) || PROTOBUF_GNUC_MIN(3, 0) #define PROTOBUF_UNUSED __attribute__((__unused__)) #else #define PROTOBUF_UNUSED #endif // ThreadSafeArenaz is turned off completely in opensource builds. // Windows declares several inconvenient macro names. We #undef them and then // restore them in port_undef.inc. #ifdef _MSC_VER #pragma push_macro("CREATE_NEW") #undef CREATE_NEW #pragma push_macro("DELETE") #undef DELETE #pragma push_macro("DOUBLE_CLICK") #undef DOUBLE_CLICK #pragma push_macro("ERROR") #undef ERROR #pragma push_macro("ERROR_BUSY") #undef ERROR_BUSY #pragma push_macro("ERROR_INSTALL_FAILED") #undef ERROR_INSTALL_FAILED #pragma push_macro("ERROR_NOT_FOUND") #undef ERROR_NOT_FOUND #pragma push_macro("GetClassName") #undef GetClassName #pragma push_macro("GetMessage") #undef GetMessage #pragma push_macro("GetObject") #undef GetObject #pragma push_macro("IGNORE") #undef IGNORE #pragma push_macro("IN") #undef IN #pragma push_macro("INPUT_KEYBOARD") #undef INPUT_KEYBOARD #pragma push_macro("NO_ERROR") #undef NO_ERROR #pragma push_macro("OUT") #undef OUT #pragma push_macro("OPTIONAL") #undef OPTIONAL #pragma push_macro("min") #undef min #pragma push_macro("max") #undef max #pragma push_macro("NEAR") #undef NEAR #pragma push_macro("NO_DATA") #undef NO_DATA #pragma push_macro("REASON_UNKNOWN") #undef REASON_UNKNOWN #pragma push_macro("SERVICE_DISABLED") #undef SERVICE_DISABLED #pragma push_macro("SEVERITY_ERROR") #undef SEVERITY_ERROR #pragma push_macro("STATUS_PENDING") #undef STATUS_PENDING #pragma push_macro("STRICT") #undef STRICT #pragma push_macro("timezone") #undef timezone #endif // _MSC_VER #ifdef __APPLE__ // Inconvenient macro names from usr/include/math.h in some macOS SDKs. #pragma push_macro("DOMAIN") #undef DOMAIN // Inconvenient macro names from /usr/include/mach/boolean.h in some macOS SDKs. #pragma push_macro("TRUE") #undef TRUE #pragma push_macro("FALSE") #undef FALSE // Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs. #pragma push_macro("UID_MAX") #undef UID_MAX #endif // __APPLE__ #if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER) // Don't let Objective-C Macros interfere with proto identifiers with the same // name. #pragma push_macro("DEBUG") #undef DEBUG #endif // defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER) #if PROTOBUF_GNUC_MIN(3, 0) // GCC does not allow disabling diagnostics within an expression: // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60875, so we disable this one // globally even though it's only used for PROTOBUF_FIELD_OFFSET. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Winvalid-offsetof" #endif // Silence some MSVC warnings in all our code. #ifdef _MSC_VER #pragma warning(push) // For non-trivial unions #pragma warning(disable : 4582) #pragma warning(disable : 4583) // For init_seg(lib) #pragma warning(disable : 4073) // To silence the fact that we will pop this push from another file #pragma warning(disable : 5031) // Conditional expression is constant #pragma warning(disable: 4127) // decimal digit terminates octal escape sequence #pragma warning(disable: 4125) #endif // We don't want code outside port_def doing complex testing, so // remove our portable condition test macros to nudge folks away from // using it themselves. #ifdef PROTOBUF_has_cpp_attribute_DEFINED_ # undef __has_cpp_attribute # undef PROTOBUF_has_cpp_attribute_DEFINED_ #endif #ifdef PROTOBUF_has_feature_DEFINED_ # undef __has_feature # undef PROTOBUF_has_feature_DEFINED_ #endif #ifdef PROTOBUF_has_warning_DEFINED_ # undef __has_warning # undef PROTOBUF_has_warning_DEFINED_ #endif #ifdef PROTOBUF_has_attribute_DEFINED_ # undef __has_attribute # undef PROTOBUF_has_attribute_DEFINED_ #endif #ifdef PROTOBUF_has_builtin_DEFINED_ # undef __has_builtin # undef PROTOBUF_has_builtin_DEFINED_ #endif