67 lines
3.2 KiB
Diff
67 lines
3.2 KiB
Diff
|
|
diff --git a/src/google/protobuf/compiler/cpp/cpp_file.cc b/src/google/protobuf/compiler/cpp/cpp_file.cc
|
||
|
|
index 24f2ccba46c3f..9526c6752f32c 100644
|
||
|
|
--- a/src/google/protobuf/compiler/cpp/cpp_file.cc
|
||
|
|
+++ b/src/google/protobuf/compiler/cpp/cpp_file.cc
|
||
|
|
@@ -499,7 +499,15 @@ void FileGenerator::GenerateSourceDefaultInstance(int idx,
|
||
|
|
// enough. However, the empty destructor fails to be elided in some
|
||
|
|
// configurations (like non-opt or with certain sanitizers). NO_DESTROY is
|
||
|
|
// there just to improve performance and binary size in these builds.
|
||
|
|
- format("PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT "
|
||
|
|
+ //
|
||
|
|
+ // Use PROTOBUF_CONSTINIT_WITH_PTR instead of PROTOBUF_CONSTINIT because, in
|
||
|
|
+ // Windows shared library builds, this constructor takes a pointer to a
|
||
|
|
+ // dllimport variable, fixed_address_empty_string. This is not constinit on
|
||
|
|
+ // Windows. This is a bug in protobuf as the default instance was intended to
|
||
|
|
+ // be constant-initialized. But the components build in Chromium is a
|
||
|
|
+ // developer configuration, so we tolerate an initializer as long as the build
|
||
|
|
+ // works, until protobuf has a proper fix.
|
||
|
|
+ format("PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT_WITH_PTR "
|
||
|
|
"PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 $1$ $2$;\n",
|
||
|
|
DefaultInstanceType(generator->descriptor_, options_),
|
||
|
|
DefaultInstanceName(generator->descriptor_, options_));
|
||
|
|
diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
|
||
|
|
index 8bd06d340f7c3..cae9ebe01ec2c 100644
|
||
|
|
--- a/src/google/protobuf/port_def.inc
|
||
|
|
+++ b/src/google/protobuf/port_def.inc
|
||
|
|
@@ -434,19 +434,26 @@
|
||
|
|
# define PROTOBUF_EXPORT __declspec(dllexport)
|
||
|
|
# define PROTOBUF_EXPORT_TEMPLATE_DECLARE
|
||
|
|
# define PROTOBUF_EXPORT_TEMPLATE_DEFINE __declspec(dllexport)
|
||
|
|
+# define PROTOBUF_CONSTINIT_WITH_PTR PROTOBUF_CONSTINIT
|
||
|
|
# else
|
||
|
|
# define PROTOBUF_EXPORT __declspec(dllimport)
|
||
|
|
# define PROTOBUF_EXPORT_TEMPLATE_DECLARE
|
||
|
|
# define PROTOBUF_EXPORT_TEMPLATE_DEFINE __declspec(dllimport)
|
||
|
|
+// Pointers to dllimport extern variables on Windows require a static
|
||
|
|
+// initialization and cannot be constant-initialized. This macro disables
|
||
|
|
+// constinit in files where we cannot support it.
|
||
|
|
+# define PROTOBUF_CONSTINIT_WITH_PTR
|
||
|
|
# 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
|
||
|
|
+# define PROTOBUF_CONSTINIT_WITH_PTR PROTOBUF_CONSTINIT
|
||
|
|
#else
|
||
|
|
# define PROTOBUF_EXPORT
|
||
|
|
# define PROTOBUF_EXPORT_TEMPLATE_DECLARE
|
||
|
|
# define PROTOBUF_EXPORT_TEMPLATE_DEFINE
|
||
|
|
+# define PROTOBUF_CONSTINIT_WITH_PTR PROTOBUF_CONSTINIT
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifdef PROTOC_EXPORT
|
||
|
|
diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
|
||
|
|
index 58136a4b47350..056c9b790ba4d 100644
|
||
|
|
--- a/src/google/protobuf/port_undef.inc
|
||
|
|
+++ b/src/google/protobuf/port_undef.inc
|
||
|
|
@@ -80,6 +80,7 @@
|
||
|
|
#undef PROTOBUF_THREAD_LOCAL
|
||
|
|
#undef PROTOBUF_MESSAGE_OWNED_ARENA_EXPERIMENT
|
||
|
|
#undef PROTOBUF_CONSTINIT
|
||
|
|
+#undef PROTOBUF_CONSTINIT_WITH_PTR
|
||
|
|
#undef PROTOBUF_CONSTEXPR
|
||
|
|
#undef PROTOBUF_ATTRIBUTE_WEAK
|
||
|
|
#undef PROTOBUF_HAVE_ATTRIBUTE_WEAK
|
||
|
|
--
|
||
|
|
2.37.0.rc0.104.g0611611a94-goog
|