gcc/libstdc++-v3/include/std
Jason Merrill 76b75018b3 c++: implement C++17 hardware interference size
The last missing piece of the C++17 standard library is the hardware
intereference size constants.  Much of the delay in implementing these has
been due to uncertainty about what the right values are, and even whether
there is a single constant value that is suitable; the destructive
interference size is intended to be used in structure layout, so program
ABIs will depend on it.

In principle, both of these values should be the same as the target's L1
cache line size.  When compiling for a generic target that is intended to
support a range of target CPUs with different cache line sizes, the
constructive size should probably be the minimum size, and the destructive
size the maximum, unless you are constrained by ABI compatibility with
previous code.

From discussion on gcc-patches, I've come to the conclusion that the
solution to the difficulty of choosing stable values is to give up on it,
and instead encourage only uses where ABI stability is unimportant: in
particular, uses where the ABI is shared at most between translation units
built at the same time with the same flags.

To that end, I've added a warning for any use of the constant value of
std::hardware_destructive_interference_size in a header or module export.
Appropriate uses within a project can disable the warning.

A previous iteration of this patch included an -finterference-tune flag to
make the value vary with -mtune; this iteration makes that the default
behavior, which should be appropriate for all reasonable uses of the
variable.  The previous default of "stable-ish" seems to me likely to have
been more of an attractive nuisance; since we can't promise actual
stability, we should instead make proper uses more convenient.

JF Bastien's implementation proposal is summarized at
https://github.com/itanium-cxx-abi/cxx-abi/issues/74

I implement this by adding new --params for the two sizes.  Targets can
override these values in targetm.target_option.override() to support a range
of values for the generic target; otherwise, both will default to the L1
cache line size.

64 bytes still seems correct for all x86.

I'm not sure why he proposed 64/64 for generic 32-bit ARM, since the Cortex
A9 has a 32-byte cache line, so I'd think 32/64 would make more sense.

He proposed 64/128 for generic AArch64, but since the A64FX now has a 256B
cache line, I've changed that to 64/256.

Other arch maintainers are invited to set ranges for their generic targets
if that seems better than using the default cache line size for both values.

With the above choice to reject stability as a goal, getting these values
"right" is now just a matter of what we want the default optimization to be,
and we can feel free to adjust them as CPUs with different cache lines
become more and less common.

gcc/ChangeLog:

	* params.opt: Add destructive-interference-size and
	constructive-interference-size.
	* doc/invoke.texi: Document them.
	* config/aarch64/aarch64.c (aarch64_override_options_internal):
	Set them.
	* config/arm/arm.c (arm_option_override): Set them.
	* config/i386/i386-options.c (ix86_option_override_internal):
	Set them.

gcc/c-family/ChangeLog:

	* c.opt: Add -Winterference-size.
	* c-cppbuiltin.c (cpp_atomic_builtins): Add __GCC_DESTRUCTIVE_SIZE
	and __GCC_CONSTRUCTIVE_SIZE.

gcc/cp/ChangeLog:

	* constexpr.c (maybe_warn_about_constant_value):
	Complain about std::hardware_destructive_interference_size.
	(cxx_eval_constant_expression): Call it.
	* decl.c (cxx_init_decl_processing): Check
	--param *-interference-size values.

libstdc++-v3/ChangeLog:

	* include/std/version: Define __cpp_lib_hardware_interference_size.
	* libsupc++/new: Define hardware interference size variables.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Winterference.H: New file.
	* g++.dg/warn/Winterference.C: New test.
	* g++.target/aarch64/interference.C: New test.
	* g++.target/arm/interference.C: New test.
	* g++.target/i386/interference.C: New test.
2021-09-13 12:28:06 -04:00
..
algorithm libstdc++: Remove unnecessary uses of <utility> 2021-07-27 12:04:18 +01:00
any libstdc++: Reduce header dependencies on <array> and <utility> 2021-07-27 12:04:18 +01:00
array libstdc++: Add [[nodiscard]] to sequence containers 2021-08-04 12:54:29 +01:00
atomic libstdc++: Implement std::atomic<T*>::compare_exchange_weak 2021-09-02 18:22:33 +01:00
barrier
bit
bitset
charconv libstdc++: Don't check always-true condition [PR101965] 2021-08-19 14:57:41 +01:00
chrono libstdc++: Improvements to Doxygen markup 2021-07-01 18:45:48 +01:00
codecvt
complex libstdc++: Simplify n-ary arithmetic promotion traits 2021-08-18 14:26:39 +01:00
concepts
condition_variable
coroutine
deque
execution
filesystem
forward_list
fstream
functional libstdc++: Define std::invoke_r for C++23 (P2136R3) 2021-09-02 17:48:45 +01:00
future libstdc++: Reduce headers included by <future> 2021-07-23 13:27:45 +01:00
iomanip
ios
iosfwd
iostream
istream
iterator
latch
limits libstdc++: Use __extension__ instead of diagnostic pragmas 2021-07-16 15:03:03 +01:00
list
locale
map
memory
memory_resource libstdc++: Specialize allocator_traits<pmr::polymorphic_allocator<T>> 2021-08-03 15:30:36 +01:00
mutex libstdc++: Only use __gthread_yield if gthreads is available 2021-07-09 15:13:38 +01:00
numbers
numeric
optional libstdc++: Simplify std::optional::value() 2021-07-27 21:36:01 +01:00
ostream
queue
random
ranges libstdc++: Add default template argument to basic_istream_view 2021-08-23 16:17:10 +01:00
ratio libstdc++: Suppress redundant definitions of inline variables 2021-08-03 15:41:11 +01:00
regex libstdc++: Reduce use of debug containers in <regex> 2021-08-09 20:46:56 +01:00
scoped_allocator libstdc++: Improve Doxygen documentation groups [PR 101258] 2021-07-01 00:25:46 +01:00
semaphore
set
shared_mutex
source_location
span libstdc++: Add valid range checks to std::span constructors [PR98421] 2021-08-31 19:13:55 +01:00
sstream
stack
stdexcept
stop_token
streambuf
string
string_view libstdc++: Add noexcept-specifier to basic_string_view(It, End) 2021-07-14 12:23:33 +01:00
syncstream
system_error libstdc++: Improvements to Doxygen markup 2021-07-01 18:45:48 +01:00
thread
tuple libstdc++: Fix move construction of std::tuple with array elements [PR101960] 2021-08-19 13:02:12 +01:00
type_traits libstdc++: Add std::is_layout_compatible trait for C++20 2021-08-24 16:12:44 +01:00
typeindex
unordered_map
unordered_set
utility libstdc++: Add conditional noexcept to std::exchange 2021-08-17 14:22:49 +01:00
valarray libstdc++: Fix non-reserved names in <valarray> 2021-08-25 22:29:26 +01:00
variant libstdc++: Reduce header dependencies on <array> and <utility> 2021-07-27 12:04:18 +01:00
vector
version c++: implement C++17 hardware interference size 2021-09-13 12:28:06 -04:00