57 lines
2.5 KiB
Diff
57 lines
2.5 KiB
Diff
|
--- a/third_party/protobuf/src/google/protobuf/arena.h
|
||
|
+++ b/third_party/protobuf/src/google/protobuf/arena.h
|
||
|
@@ -245,7 +245,7 @@ struct ArenaOptions {
|
||
|
// well as protobuf container types like RepeatedPtrField and Map. The protocol
|
||
|
// is internal to protobuf and is not guaranteed to be stable. Non-proto types
|
||
|
// should not rely on this protocol.
|
||
|
-class PROTOBUF_EXPORT alignas(8) Arena final {
|
||
|
+class PROTOBUF_EXPORT PROTOBUF_ALIGNAS(8) Arena final {
|
||
|
public:
|
||
|
// Arena constructor taking custom options. See ArenaOptions below for
|
||
|
// descriptions of the options available.
|
||
|
--- a/third_party/protobuf/src/google/protobuf/port_def.inc
|
||
|
+++ b/third_party/protobuf/src/google/protobuf/port_def.inc
|
||
|
@@ -528,6 +528,35 @@ PROTOBUF_EXPORT_TEMPLATE_TEST(DEFAULT, __declspec(dllimport));
|
||
|
#undef IN
|
||
|
#endif // _MSC_VER
|
||
|
|
||
|
+// 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.
|
||
|
+#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
|
||
|
+
|
||
|
#if defined(__clang__)
|
||
|
#pragma clang diagnostic push
|
||
|
// TODO(gerbens) ideally we cleanup the code. But a cursory try shows many
|
||
|
--- a/third_party/protobuf/src/google/protobuf/port_undef.inc
|
||
|
+++ b/third_party/protobuf/src/google/protobuf/port_undef.inc
|
||
|
@@ -80,6 +80,7 @@
|
||
|
#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_foj3FJo5StF0OvIzl7oMxA__declspec
|
||
|
#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_dllexport
|
||
|
#undef PROTOBUF_EXPORT_TEMPLATE_STYLE_MATCH_DECLSPEC_dllimport
|
||
|
+#undef PROTOBUF_ALIGNAS
|