992 lines
36 KiB
PHP
992 lines
36 KiB
PHP
|
// -*- c++ -*-
|
||
|
// Protocol Buffers - Google's data interchange format
|
||
|
// Copyright 2008 Google Inc. All rights reserved.
|
||
|
//
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file or at
|
||
|
// https://developers.google.com/open-source/licenses/bsd
|
||
|
|
||
|
// 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.
|
||
|
|
||
|
#ifndef PROTOBUF_USE_DLLS
|
||
|
#define PROTOBUF_USE_DLLS
|
||
|
#endif // PROTOBUF_USE_DLLS
|
||
|
|
||
|
#ifdef PROTOBUF_PORT_
|
||
|
#error "port_def.inc included multiple times"
|
||
|
#endif
|
||
|
#define PROTOBUF_PORT_
|
||
|
#include "absl/base/attributes.h"
|
||
|
#include "absl/base/config.h"
|
||
|
#include "absl/base/macros.h"
|
||
|
|
||
|
// 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 check for gcc-style atomic built-ins
|
||
|
#if ABSL_HAVE_BUILTIN(__atomic_load_n)
|
||
|
#define PROTOBUF_BUILTIN_ATOMIC 1
|
||
|
#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
|
||
|
|
||
|
#if defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__)
|
||
|
#define PROTOBUF_CLANG_MIN(x, y) \
|
||
|
(__clang_major__ > (x) || (__clang_major__ == (x) && __clang_minor__ >= (y)))
|
||
|
#else
|
||
|
#define PROTOBUF_CLANG_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
|
||
|
|
||
|
// Check minimum Protobuf support defined at:
|
||
|
// https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md
|
||
|
#ifdef __clang__
|
||
|
static_assert(PROTOBUF_CLANG_MIN(6, 0), "Protobuf only supports Clang 6.0 and newer.");
|
||
|
#elif defined(__GNUC__)
|
||
|
static_assert(PROTOBUF_GNUC_MIN(7, 3), "Protobuf only supports GCC 7.3 and newer.");
|
||
|
#elif defined(_MSVC_LANG)
|
||
|
static_assert(PROTOBUF_MSC_VER_MIN(1910), "Protobuf only supports MSVC 2017 and newer.");
|
||
|
#endif
|
||
|
static_assert(PROTOBUF_CPLUSPLUS_MIN(201402L), "Protobuf only supports C++14 and newer.");
|
||
|
|
||
|
// Check minimum Abseil version.
|
||
|
#if defined(ABSL_LTS_RELEASE_VERSION) && defined(ABSL_LTS_RELEASE_PATCH_LEVEL)
|
||
|
#define PROTOBUF_ABSL_MIN(x, y) \
|
||
|
(ABSL_LTS_RELEASE_VERSION > (x) || \
|
||
|
(ABSL_LTS_RELEASE_VERSION == (x) && ABSL_LTS_RELEASE_PATCH_LEVEL >= (y)))
|
||
|
#else
|
||
|
// If we can't find an Abseil version, it's either not installed at all (which
|
||
|
// should trigger cmake errors), using a non-LTS release, or just isn't used in
|
||
|
// this file.
|
||
|
#define PROTOBUF_ABSL_MIN(x, y) 1
|
||
|
#endif
|
||
|
|
||
|
static_assert(PROTOBUF_ABSL_MIN(20230125, 3),
|
||
|
"Protobuf only supports Abseil version 20230125.3 and newer.");
|
||
|
|
||
|
// 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.
|
||
|
|
||
|
#ifdef PROTOBUF_FUTURE_BREAKING_CHANGES
|
||
|
|
||
|
// Used for descriptor proto extension declarations.
|
||
|
// Owner: shaod@, gberg@
|
||
|
#define PROTOBUF_FUTURE_DESCRIPTOR_EXTENSION_DECL 1
|
||
|
|
||
|
// Removes Arena::CreateMessage, as Arena::Create is equivalent
|
||
|
// Owner: ckennelly@, mkruskal@
|
||
|
#define PROTOBUF_FUTURE_REMOVE_CREATEMESSAGE 1
|
||
|
|
||
|
// Renames DescriptorPool::AddUnusedImportTrackFile
|
||
|
// Owner: mkruskal@
|
||
|
#define PROTOBUF_FUTURE_RENAME_ADD_UNUSED_IMPORT 1
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPE
|
||
|
#error PROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPE was previously defined
|
||
|
#endif
|
||
|
#if defined(PROTOBUF_TEMPORARY_ENABLE_STRING_VIEW_RETURN_TYPE)
|
||
|
#define PROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPE 1
|
||
|
#endif
|
||
|
|
||
|
#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 defined(__GNUC__)
|
||
|
# define PROTOBUF_ALWAYS_INLINE __attribute__((always_inline))
|
||
|
#elif defined(_MSC_VER)
|
||
|
# define PROTOBUF_ALWAYS_INLINE __forceinline
|
||
|
#else
|
||
|
# define PROTOBUF_ALWAYS_INLINE
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_ALWAYS_INLINE_CALL
|
||
|
#error PROTOBUF_ALWAYS_INLINE_CALL was previously defined
|
||
|
#endif
|
||
|
// For functions we want to force inline from the caller, instead of in the
|
||
|
// declaration of the callee.
|
||
|
// This is useful for lambdas where it is not easy to specify ALWAYS_INLINE.
|
||
|
// Use like:
|
||
|
// PROTOBUF_ALWAYS_INLINE_CALL res = SomeFunc(args...);
|
||
|
#if defined(__clang__) && !defined(PROTOBUF_NO_INLINE_CALL) && \
|
||
|
ABSL_HAVE_CPP_ATTRIBUTE(clang::always_inline)
|
||
|
#define PROTOBUF_ALWAYS_INLINE_CALL [[clang::always_inline]]
|
||
|
#else
|
||
|
#define PROTOBUF_ALWAYS_INLINE_CALL
|
||
|
#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.
|
||
|
//
|
||
|
// For forward-declared functions, make sure to apply PROTOBUF_NOINLINE to all
|
||
|
// the declarations, not just the definition, or else whole-program optimization
|
||
|
// may not honor the attribute.
|
||
|
#ifdef PROTOBUF_NOINLINE
|
||
|
#error PROTOBUF_NOINLINE was previously defined
|
||
|
#endif
|
||
|
#if defined(__GNUC__)
|
||
|
# 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 ABSL_HAVE_CPP_ATTRIBUTE(clang::musttail) && !defined(__arm__) && \
|
||
|
!defined(_ARCH_PPC) && !defined(__wasm__) && \
|
||
|
!(defined(_MSC_VER) && defined(_M_IX86)) && !defined(__i386__)
|
||
|
// 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
|
||
|
#define PROTOBUF_MUSTTAIL [[clang::musttail]]
|
||
|
#define PROTOBUF_TAILCALL true
|
||
|
#else
|
||
|
#define PROTOBUF_MUSTTAIL
|
||
|
#define PROTOBUF_TAILCALL false
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_CC
|
||
|
#error PROTOBUF_CC was previously defined
|
||
|
#endif
|
||
|
#define PROTOBUF_CC
|
||
|
|
||
|
#if defined(__clang__)
|
||
|
#define PROTOBUF_IGNORE_DEPRECATION_START \
|
||
|
_Pragma("clang diagnostic push") \
|
||
|
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
|
||
|
#define PROTOBUF_IGNORE_DEPRECATION_STOP \
|
||
|
_Pragma("clang diagnostic pop")
|
||
|
#elif defined(__GNUC__)
|
||
|
#define PROTOBUF_IGNORE_DEPRECATION_START \
|
||
|
_Pragma("GCC diagnostic push") \
|
||
|
_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
|
||
|
#define PROTOBUF_IGNORE_DEPRECATION_STOP \
|
||
|
_Pragma("GCC diagnostic pop")
|
||
|
#else
|
||
|
#define PROTOBUF_IGNORE_DEPRECATION_START
|
||
|
#define PROTOBUF_IGNORE_DEPRECATION_STOP
|
||
|
#endif
|
||
|
|
||
|
#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 ABSL_HAVE_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 defined(__GNUC__)
|
||
|
#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<const char*>( \
|
||
|
&reinterpret_cast<const TYPE*>(16)->FIELD) - \
|
||
|
reinterpret_cast<const char*>(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 defined(__GNUC__)
|
||
|
# 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 ABSL_HAVE_CPP_ATTRIBUTE(nodiscard) && PROTOBUF_CPLUSPLUS_MIN(201703L)
|
||
|
#define PROTOBUF_NODISCARD [[nodiscard]]
|
||
|
#elif ABSL_HAVE_ATTRIBUTE(warn_unused_result) || defined(__GNUC__)
|
||
|
#define PROTOBUF_NODISCARD __attribute__((warn_unused_result))
|
||
|
#else
|
||
|
#define PROTOBUF_NODISCARD
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_RESTRICT
|
||
|
#error PROTOBUF_RESTRICT was previously defined
|
||
|
#endif
|
||
|
#if defined( __clang__) || defined(__GNUC__)
|
||
|
#define PROTOBUF_RESTRICT __restrict
|
||
|
#else
|
||
|
#define PROTOBUF_RESTRICT
|
||
|
#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 defined(__GNUC__)
|
||
|
#define PROTOBUF_ALIGNAS(byte_alignment) \
|
||
|
__attribute__((aligned(byte_alignment)))
|
||
|
#else
|
||
|
#define PROTOBUF_ALIGNAS(byte_alignment) alignas(byte_alignment)
|
||
|
#endif
|
||
|
|
||
|
#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
|
||
|
|
||
|
#ifdef PROTOBUF_CONSTINIT
|
||
|
#error PROTOBUF_CONSTINIT was previously defined
|
||
|
#endif
|
||
|
|
||
|
// Lexan sets both MSV_VER and clang, so handle it with the clang path.
|
||
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||
|
// MSVC 17 currently seems to raise an error about constant-initialized pointers.
|
||
|
# if PROTOBUF_MSC_VER_MIN(1930)
|
||
|
# define PROTOBUF_CONSTINIT
|
||
|
# define PROTOBUF_CONSTEXPR constexpr
|
||
|
# endif
|
||
|
#elif defined(__GNUC__) && !defined(__clang__)
|
||
|
// GCC doesn't support constinit aggregate initialization of absl::Cord.
|
||
|
# if PROTOBUF_GNUC_MIN(12, 2)
|
||
|
# define PROTOBUF_CONSTINIT
|
||
|
# define PROTOBUF_CONSTEXPR constexpr
|
||
|
# endif
|
||
|
#else
|
||
|
# if defined(__cpp_constinit) && !defined(__CYGWIN__)
|
||
|
# define PROTOBUF_CONSTINIT constinit
|
||
|
# define PROTOBUF_CONSTEXPR constexpr
|
||
|
# define PROTOBUF_CONSTINIT_DEFAULT_INSTANCES
|
||
|
// 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.
|
||
|
#elif !defined(__CYGWIN__) && !defined(__MINGW32__) && \
|
||
|
ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization) && \
|
||
|
((defined(__APPLE__) && PROTOBUF_CLANG_MIN(13, 0)) || \
|
||
|
(!defined(__APPLE__) && PROTOBUF_CLANG_MIN(12, 0)))
|
||
|
# define PROTOBUF_CONSTINIT [[clang::require_constant_initialization]]
|
||
|
# define PROTOBUF_CONSTEXPR constexpr
|
||
|
# define PROTOBUF_CONSTINIT_DEFAULT_INSTANCES
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
#ifndef PROTOBUF_CONSTINIT
|
||
|
#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 ABSL_HAVE_CPP_ATTRIBUTE(clang::no_destroy)
|
||
|
#define PROTOBUF_ATTRIBUTE_NO_DESTROY [[clang::no_destroy]]
|
||
|
#else
|
||
|
#define PROTOBUF_ATTRIBUTE_NO_DESTROY
|
||
|
#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 defined(__GNUC__) && (!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 ABSL_HAVE_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 ABSL_HAVE_FEATURE(address_sanitizer)
|
||
|
# define PROTOBUF_ASAN 1
|
||
|
# endif
|
||
|
#if ABSL_HAVE_FEATURE(thread_sanitizer)
|
||
|
# define PROTOBUF_TSAN 1
|
||
|
# endif
|
||
|
#if ABSL_HAVE_FEATURE(memory_sanitizer)
|
||
|
# define PROTOBUF_MSAN 1
|
||
|
# endif
|
||
|
#elif defined(__GNUC__)
|
||
|
// 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
|
||
|
# ifdef __SANITIZE_MEMORY__
|
||
|
# if __SANITIZE_MEMORY__
|
||
|
# define PROTOBUF_ASAN 1
|
||
|
# endif
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_ASAN
|
||
|
#include <sanitizer/asan_interface.h>
|
||
|
#define PROTOBUF_POISON_MEMORY_REGION(p, n) ASAN_POISON_MEMORY_REGION(p, n)
|
||
|
#define PROTOBUF_UNPOISON_MEMORY_REGION(p, n) ASAN_UNPOISON_MEMORY_REGION(p, n)
|
||
|
#else // PROTOBUF_ASAN
|
||
|
#define PROTOBUF_POISON_MEMORY_REGION(p, n)
|
||
|
#define PROTOBUF_UNPOISON_MEMORY_REGION(p, n)
|
||
|
#endif // PROTOBUF_ASAN
|
||
|
|
||
|
#ifdef PROTOBUF_TSAN
|
||
|
#define PROTOBUF_TSAN_DECLARE_MEMBER ::uint32_t _tsan_detect_race = 0;
|
||
|
#else
|
||
|
#define PROTOBUF_TSAN_DECLARE_MEMBER
|
||
|
#endif
|
||
|
|
||
|
// Note that this is performance sensitive: changing the parameters will change
|
||
|
// the registers used by the ABI calling convention, which subsequently affects
|
||
|
// register selection logic inside the function.
|
||
|
// Arguments `msg`, `ptr` and `ctx` are the 1st/2nd/3rd argument to match the
|
||
|
// signature of ParseLoop.
|
||
|
//
|
||
|
// Note for x86_64: `data` must be the third or fourth argument for performance
|
||
|
// reasons. In order to efficiently read the second byte of `data` we need it to
|
||
|
// be passed in RDX or RCX.
|
||
|
#define PROTOBUF_TC_PARAM_DECL \
|
||
|
::google::protobuf::MessageLite *msg, const char *ptr, \
|
||
|
::google::protobuf::internal::ParseContext *ctx, \
|
||
|
::google::protobuf::internal::TcFieldData data, \
|
||
|
const ::google::protobuf::internal::TcParseTableBase *table, uint64_t hasbits
|
||
|
// PROTOBUF_TC_PARAM_PASS passes values to match PROTOBUF_TC_PARAM_DECL.
|
||
|
#define PROTOBUF_TC_PARAM_PASS msg, ptr, ctx, data, table, hasbits
|
||
|
|
||
|
// PROTOBUF_TC_PARAM_NO_DATA_DECL and PROTOBUF_TC_PARAM_NO_DATA_PASS provide the
|
||
|
// exact same ABI as above, except that they don't name or pass the `data`
|
||
|
// argument. Specific functions such as `Error() and `ToTagDispatch()` don't
|
||
|
// use the `data` argument. By not passing `data` down the call stack, we free
|
||
|
// up the register holding that value, which may matter in highly optimized
|
||
|
// functions such as varint parsing.
|
||
|
#define PROTOBUF_TC_PARAM_NO_DATA_DECL \
|
||
|
::google::protobuf::MessageLite *msg, const char *ptr, \
|
||
|
::google::protobuf::internal::ParseContext *ctx, ::google::protobuf::internal::TcFieldData, \
|
||
|
const ::google::protobuf::internal::TcParseTableBase *table, uint64_t hasbits
|
||
|
#define PROTOBUF_TC_PARAM_NO_DATA_PASS \
|
||
|
msg, ptr, ctx, ::google::protobuf::internal::TcFieldData::DefaultInit(), table, hasbits
|
||
|
|
||
|
#ifdef PROTOBUF_UNUSED
|
||
|
#error PROTOBUF_UNUSED was previously defined
|
||
|
#endif
|
||
|
#if ABSL_HAVE_CPP_ATTRIBUTE(maybe_unused) || \
|
||
|
(PROTOBUF_MSC_VER_MIN(1911) && PROTOBUF_CPLUSPLUS_MIN(201703L))
|
||
|
#define PROTOBUF_UNUSED [[maybe_unused]]
|
||
|
#elif ABSL_HAVE_ATTRIBUTE(unused) || defined(__GNUC__)
|
||
|
#define PROTOBUF_UNUSED __attribute__((__unused__))
|
||
|
#else
|
||
|
#define PROTOBUF_UNUSED
|
||
|
#endif
|
||
|
|
||
|
// For the toolchains that support it, evaluates to `true` if the input is
|
||
|
// determined to be a compile time constant after optimizations have happened
|
||
|
// (like inlining and constant propagation). A `false` result means that the
|
||
|
// compiler could not determine it is constant (it might still be but couldn't
|
||
|
// figure it out).
|
||
|
#ifdef PROTOBUF_BUILTIN_CONSTANT_P
|
||
|
#error PROTOBUF_BUILTIN_CONSTANT_P was previously defined
|
||
|
#endif
|
||
|
#if ABSL_HAVE_BUILTIN(__builtin_constant_p)
|
||
|
#define PROTOBUF_BUILTIN_CONSTANT_P(x) __builtin_constant_p(x)
|
||
|
#else
|
||
|
#define PROTOBUF_BUILTIN_CONSTANT_P(x) false
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_CUSTOM_VTABLE
|
||
|
#error PROTOBUF_CUSTOM_VTABLE was previously defined
|
||
|
#endif
|
||
|
#if !defined(PROTOBUF_CUSTOM_VTABLE)
|
||
|
#define PROTOBUF_VIRTUAL virtual
|
||
|
#define PROTOBUF_OVERRIDE override
|
||
|
#define PROTOBUF_FINAL final
|
||
|
#endif
|
||
|
|
||
|
// Determines the platforms where descriptor weak messages can be used.
|
||
|
#ifdef PROTOBUF_DESCRIPTOR_WEAK_MESSAGES_ALLOWED
|
||
|
#error PROTOBUF_DESCRIPTOR_WEAK_MESSAGES_ALLOWED was previously defined
|
||
|
#endif
|
||
|
#if defined(__GNUC__) && defined(__clang__) && !defined(__APPLE__) && \
|
||
|
!defined(_MSC_VER)
|
||
|
#define PROTOBUF_DESCRIPTOR_WEAK_MESSAGES_ALLOWED
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// TODO: Enable the feature by default and remove this flag.
|
||
|
#ifdef PROTOBUF_PREFETCH_PARSE_TABLE
|
||
|
#error PROTOBUF_PREFETCH_PARSE_TABLE was previously defined
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_PREFETCH_WITH_OFFSET
|
||
|
#error PROTOBUF_PREFETCH_WITH_OFFSET was previously defined
|
||
|
#endif
|
||
|
#if defined(__x86_64__) && defined(__GNUC__)
|
||
|
#define PROTOBUF_PREFETCH_WITH_OFFSET(base, offset) \
|
||
|
asm("prefetcht0 " #offset "(%0)" : : "r"(base));
|
||
|
#else
|
||
|
#define PROTOBUF_PREFETCH_WITH_OFFSET(base, offset)
|
||
|
#endif
|
||
|
|
||
|
// ThreadSafeArenaz is turned off completely in opensource builds.
|
||
|
|
||
|
// noreturn is defined as a macro in C's stdnoreturn.h
|
||
|
#ifdef noreturn
|
||
|
#define PROTOBUF_DID_UNDEF_noreturn
|
||
|
#pragma push_macro("noreturn")
|
||
|
#undef noreturn
|
||
|
#endif
|
||
|
|
||
|
// autoheader defines this in some circumstances
|
||
|
#ifdef PACKAGE
|
||
|
#define PROTOBUF_DID_UNDEF_PACKAGE
|
||
|
#pragma push_macro("PACKAGE")
|
||
|
#undef PACKAGE
|
||
|
#endif
|
||
|
|
||
|
// a few common headers define this
|
||
|
#ifdef PACKED
|
||
|
#define PROTOBUF_DID_UNDEF_PACKED
|
||
|
#pragma push_macro("PACKED")
|
||
|
#undef PACKED
|
||
|
#endif
|
||
|
|
||
|
// This is a macro on Windows, macOS, and some variants of GCC.
|
||
|
#ifdef DOMAIN
|
||
|
#define PROTOBUF_DID_UNDEF_DOMAIN
|
||
|
#pragma push_macro("DOMAIN")
|
||
|
#undef DOMAIN
|
||
|
#endif
|
||
|
|
||
|
// linux is a legacy MACRO defined in most popular C++ standards.
|
||
|
#ifdef linux
|
||
|
#pragma push_macro("linux")
|
||
|
#undef linux
|
||
|
#define PROTOBUF_DID_UNDEF_LINUX
|
||
|
#endif
|
||
|
|
||
|
// Windows declares several inconvenient macro names. We #undef them and then
|
||
|
// restore them in port_undef.inc.
|
||
|
#ifdef _WIN32
|
||
|
#pragma push_macro("CompareString")
|
||
|
#undef CompareString
|
||
|
#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("ERROR_RETRY")
|
||
|
#undef ERROR_RETRY
|
||
|
#pragma push_macro("ERROR_TIMEOUT")
|
||
|
#undef ERROR_TIMEOUT
|
||
|
#pragma push_macro("GetClassName")
|
||
|
#undef GetClassName
|
||
|
#pragma push_macro("GetCurrentTime")
|
||
|
#undef GetCurrentTime
|
||
|
#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("SERVICE_STOP")
|
||
|
#undef SERVICE_STOP
|
||
|
#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
|
||
|
#pragma push_macro("TRUE")
|
||
|
#undef TRUE
|
||
|
#pragma push_macro("FALSE")
|
||
|
#undef FALSE
|
||
|
#endif // _WIN32
|
||
|
|
||
|
#ifdef __APPLE__
|
||
|
// 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
|
||
|
#pragma push_macro("GID_MAX")
|
||
|
#undef GID_MAX
|
||
|
// TYPE_BOOL is defined in the MacOS's ConditionalMacros.h.
|
||
|
#pragma push_macro("TYPE_BOOL")
|
||
|
#undef TYPE_BOOL
|
||
|
#endif // __APPLE__
|
||
|
|
||
|
#if defined(ANDROID) || defined(__ANDROID__)
|
||
|
// Inconvenient macro names from usr/include/limits.h in some Android NDKs.
|
||
|
#pragma push_macro("UID_MAX")
|
||
|
#undef UID_MAX
|
||
|
#pragma push_macro("GID_MAX")
|
||
|
#undef GID_MAX
|
||
|
#endif // defined(ANDROID) || defined(__ANDROID__)
|
||
|
|
||
|
#ifdef __FreeBSD__
|
||
|
// Inconvenient macro names from /usr/include/sys/param.h.
|
||
|
#pragma push_macro("TRUE")
|
||
|
#undef TRUE
|
||
|
#pragma push_macro("FALSE")
|
||
|
#undef FALSE
|
||
|
// Inconvenient macro names from /usr/include/sys/limits.h.
|
||
|
#pragma push_macro("UID_MAX")
|
||
|
#undef UID_MAX
|
||
|
#pragma push_macro("GID_MAX")
|
||
|
#undef GID_MAX
|
||
|
#endif // __FreeBSD__
|
||
|
|
||
|
#if defined(__clang__) || defined(__GNUC__) || 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__) || defined(__GNUC__) || defined(_MSC_VER)
|
||
|
|
||
|
// Protobuf does not support building with a number of warnings that are noisy
|
||
|
// (and of variable quality across compiler versions) or impossible to implement
|
||
|
// effectively but which people turn on anyways.
|
||
|
#ifdef __clang__
|
||
|
#pragma clang diagnostic push
|
||
|
// -Wshorten-64-to-32 is a typical pain where we diff pointers.
|
||
|
// char* p = strchr(s, '\n');
|
||
|
// return p ? p - s : -1;
|
||
|
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
|
||
|
// Turn on -Wdeprecated-enum-enum-conversion. This deprecation comes in C++20
|
||
|
// via http://wg21.link/p1120r0.
|
||
|
#pragma clang diagnostic error "-Wdeprecated-enum-enum-conversion"
|
||
|
// This error has been generally flaky, but we need to disable it specifically
|
||
|
// to fix https://github.com/protocolbuffers/protobuf/issues/12313
|
||
|
#pragma clang diagnostic ignored "-Wunused-parameter"
|
||
|
// -Wshadow means that declaration shadows a variable.
|
||
|
// for (int i = 0; i < file_->public_dependency_count(); ++i)
|
||
|
// for (int i = 0; i < public_dep->message_type_count(); ++i)
|
||
|
#pragma clang diagnostic ignored "-Wshadow"
|
||
|
#pragma clang diagnostic ignored "-Wextra-semi"
|
||
|
#endif
|
||
|
#ifdef __GNUC__
|
||
|
#pragma GCC diagnostic push
|
||
|
// Some of the warnings below only exist in some GCC versions; those version
|
||
|
// ranges are poorly documented.
|
||
|
#pragma GCC diagnostic ignored "-Wpragmas"
|
||
|
// 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 ignored "-Winvalid-offsetof"
|
||
|
// Some versions of GCC seem to think that
|
||
|
// [this] { Foo(); }
|
||
|
// leaves `this` unused, even though `Foo();` is a member function of the
|
||
|
// captured `this`.
|
||
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=1373625
|
||
|
#pragma GCC diagnostic ignored "-Wunused-lambda-capture"
|
||
|
// -Wsign-conversion causes a lot of warnings on mostly code like:
|
||
|
// int index = ...
|
||
|
// int value = vec[index];
|
||
|
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
||
|
// This error has been generally flaky, but we need to disable it specifically
|
||
|
// to fix https://github.com/protocolbuffers/protobuf/issues/12313
|
||
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||
|
// -Wshadow means that declaration shadows a variable.
|
||
|
// for (int i = 0; i < file_->public_dependency_count(); ++i)
|
||
|
// for (int i = 0; i < public_dep->message_type_count(); ++i)
|
||
|
#pragma GCC diagnostic ignored "-Wshadow"
|
||
|
#ifndef __clang__
|
||
|
// This causes spurious warnings in GCC 13.
|
||
|
#pragma GCC diagnostic ignored "-Wstringop-overflow"
|
||
|
// This causes spurious warnings in GCC 13.
|
||
|
#pragma GCC diagnostic ignored "-Wself-move"
|
||
|
// Ignore warning: extra ';' [-Wpedantic]
|
||
|
#pragma GCC diagnostic ignored "-Wpedantic"
|
||
|
#endif
|
||
|
#if __GNUC__ == 12 && __GNUC_MINOR__ < 4
|
||
|
// Wrong warning emitted when assigning a single char c-string to a std::string
|
||
|
// in c++20 mode and optimization on.
|
||
|
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105329
|
||
|
// Planned to be fixed by 12.3 but widen window to 12.4.
|
||
|
#pragma GCC diagnostic ignored "-Wrestrict"
|
||
|
#endif
|
||
|
#endif // __GNUC__
|
||
|
|
||
|
// 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
|
||
|
|
||
|
#if PROTOBUF_ENABLE_DEBUG_LOGGING_MAY_LEAK_PII
|
||
|
#define PROTOBUF_DEBUG true
|
||
|
#else
|
||
|
#define PROTOBUF_DEBUG false
|
||
|
#endif
|
||
|
|
||
|
#ifdef PROTOBUF_NO_THREADLOCAL
|
||
|
#error PROTOBUF_NO_THREADLOCAL was previously defined
|
||
|
#endif
|
||
|
|
||
|
// port_def.inc may be included in very large compilation targets, so we need to
|
||
|
// minimize adding symbol and source file information here. For this reason we
|
||
|
// implement our own simple `protobuf_assumption_failed()` function for
|
||
|
// asserting PROTOBUF_ASSUME predicates in debug builds.
|
||
|
namespace google {
|
||
|
namespace protobuf {
|
||
|
namespace internal {
|
||
|
[[noreturn]] PROTOBUF_EXPORT void protobuf_assumption_failed(const char *pred,
|
||
|
const char *file,
|
||
|
int line);
|
||
|
} // namespace internal
|
||
|
} // namespace protobuf
|
||
|
} // namespace google
|
||
|
|
||
|
// PROTOBUF_ASSUME(pred) tells the compiler that it can assume pred is true.
|
||
|
// To be safe, we also validate the assumption in debug builds, printing an
|
||
|
// assert style "Assumption failed: ..." message and aborting the program if
|
||
|
// the predicate is false. 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 ABSL_HAVE_BUILTIN(__builtin_assume)
|
||
|
#ifdef NDEBUG
|
||
|
#define PROTOBUF_ASSUME(pred) __builtin_assume(pred)
|
||
|
#else // NDEBUG
|
||
|
#define PROTOBUF_ASSUME(pred) \
|
||
|
if (!(pred)) { \
|
||
|
::google::protobuf::internal::protobuf_assumption_failed(#pred, __FILE__, __LINE__); \
|
||
|
} \
|
||
|
__builtin_assume(pred)
|
||
|
#endif // NDEBUG
|
||
|
#else // has_builtin(__builtin_assume)
|
||
|
#ifndef NDEBUG
|
||
|
#define PROTOBUF_ASSUME(pred) \
|
||
|
if (!(pred)) { \
|
||
|
::google::protobuf::internal::protobuf_assumption_failed(#pred, __FILE__, __LINE__); \
|
||
|
}
|
||
|
#else // !NDEBUG
|
||
|
#define PROTOBUF_ASSUME(pred)
|
||
|
#endif // !NDEBUG
|
||
|
#endif // has_builtin(__builtin_assume)
|
||
|
|
||
|
#ifdef PROTOBUF_DEPRECATE_AND_INLINE
|
||
|
#error PROTOBUF_DEPRECATE_AND_INLINE was previously defined
|
||
|
#endif
|
||
|
#if defined(ABSL_DEPRECATE_AND_INLINE)
|
||
|
#define PROTOBUF_DEPRECATE_AND_INLINE() ABSL_DEPRECATE_AND_INLINE()
|
||
|
#else
|
||
|
#define PROTOBUF_DEPRECATE_AND_INLINE() [[deprecated]]
|
||
|
#endif
|
||
|
|
||
|
|
||
|
namespace google {
|
||
|
namespace protobuf {
|
||
|
namespace internal {
|
||
|
#if defined(PROTOBUF_INTERNAL_ENABLE_DEBUG_COUNTERS)
|
||
|
#define PROTOBUF_DEBUG_COUNTER(name) \
|
||
|
([]() -> auto & { \
|
||
|
static constexpr const char *counter_name = name; \
|
||
|
static ::google::protobuf::internal::RealDebugCounter counter(counter_name); \
|
||
|
return counter; \
|
||
|
}())
|
||
|
|
||
|
#else // PROTOBUF_ENABLE_DEBUG_COUNTERS
|
||
|
#define PROTOBUF_DEBUG_COUNTER(name) \
|
||
|
::google::protobuf::internal::NoopDebugCounter {}
|
||
|
#endif // PROTOBUF_ENABLE_DEBUG_COUNTERS
|
||
|
} // namespace internal
|
||
|
} // namespace protobuf
|
||
|
} // namespace google
|