================
@@ -89,6 +89,19 @@ sections with improvements to Clang's support for those 
languages.
 C++ Language Changes
 --------------------
 
+C++17 Feature Support
+^^^^^^^^^^^^^^^^^^^^^
+- Clang now exposes ``__GCC_DESTRUCTIVE_SIZE`` and ``__GCC_CONSTRUCTIVE_SIZE``
+  predefined macros to support standard library implementations of
+  ``std::hardware_destructive_interference_size`` and
+  ``std::hardware_constructive_interference_size``, respectively. These macros
+  are predefined in all C and C++ language modes. These macros can be
+  overridden on the command line with ``-D``, if desired. The values the macros
----------------
jyknight wrote:

> My comment was only to not encourage using -D. The fact it's defined through 
> a macro is really an implementation details, the macro is not meant to be 
> user facing.

There should to be a user-facing way to set this, in order to pin it to a 
particular value. If not -D, then e.g. copy GCC's `--param 
hardware_destructive_interference_size=N` command-line.

> we don't really make special cases for all the other potentially ABI-terrible 
> ideas people can come up with in a header file

IMO, the special thing about this is that it's exposed by the standard library 
in a way that invites and suggests the _precise usage_ which is ABI-unstable. 
The purpose of `hardware_destructive_interference_size` is to put 
`alignas(std::hardware_destructive_interference_size)` on a struct. Yet, 
putting that into a header is a terrible idea almost all of the time -- it 
should be affected by -mtune, and may be changed by compiler upgrades. This is 
quite non-obvious issue for users, since the C++ stdlib generally goes to a 
huge amount of effort to remain ABI-stable for users. How do they know that 
_this_ constant is not ABI-stable, unlike the entire rest of the library?

The way GCC handles it is to warn for _any_ use of 
`std::hardware_destructive_interference_size` in a header -- but only that one, 
not `hardware_constructive_interference_size`. I think the rationale is that 
the documented/expected usage of `destructive` is to use to add padding and/or 
alignment, while the documented/expected usage of `constructive` is to 
static_assert that a struct is smaller than it. It actually doesn't 
bother to warn on the internal __GCC_* macros at all.

That may not be ideal, but it's a relatively simple solution that seems likely 
to be good enough. I think Clang could quite reasonably do the same thing.

https://github.com/llvm/llvm-project/pull/89446
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to