On Wed, 30 Apr 2025 at 12:12, Tomasz Kaminski <tkami...@redhat.com> wrote:
>
>
>
> On Tue, Apr 29, 2025 at 10:11 PM Jonathan Wakely <jwak...@redhat.com> wrote:
>>
>> Currently the GLIBCXX_ENABLE_ATOMIC_BUILTINS macro checks for a variety
>> of __atomic built-ins for bool, short and int. If all those checks pass,
>> then it defines _GLIBCXX_ATOMIC_BUILTINS and uses the definitions from
>> config/cpu/generic/atomicity_builtins/atomicity.h for the non-inline
>> versions of __exchange_and_add and __atomic_add that get compiled into
>> libsupc++.
>>
>> However, the config/cpu/generic/atomicity_builtins/atomicity.h
>> definitions only depend on __atomic_fetch_add not on
>> __atomic_test_and_set or __atomic_compare_exchange. And they only
>> operate on a variable of type _Atomic word, which is not necessarily one
>> of bool, short or int (e.g. for sparcv9 _Atomic_word is 64-bit long).
>>
>> This means that for a target where _Atomic_word is int but there are no
>> 1-byte or 2-byte atomic instructions, GLIBCXX_ENABLE_ATOMIC_BUILTINS
>> will fail the checks for bool and short and not define the macro
>> _GLIBCXX_ATOMIC_BUILTINS. That means that we will use a single global
>> mutex for reference counting in the COW std::string and std::locale,
>> even though we could use __atomic_fetch_add to do it lock-free.
>>
>> This commit removes most of the GLIBCXX_ENABLE_ATOMIC_BUILTINS checks,
>> so that it only checks __atomic_fetch_add on _Atomic_word. This will
>> enable the atomic versions of __exchange_and_add and __atomic_add for
>> more targets. This is not an ABI change, because for targets which
>> didn't previously use the atomic definitions of those function, they
>> always make a non-inlined call to the functions in the library. If the
>> definition of those functions now start using atomics, that doesn't
>> change the semantics for the code calling those functions.
>>
>> On affected targets, new code compiled after this change will see the
>> _GLIBCXX_ATOMIC_BUILTINS macro and so will use the always-inline
>> versions of __exchange_and_add and __atomic_add, which use
>> __atomic_fetch_add directly. That is also compatible with older code
>> which calls the non-inline definitions, because those non-inline
>> definitions now also use __atomic_fetch_add.
>>
>> The only configuration where this could be an ABI change is for a target
>> which currently defines _GLIBCXX_ATOMIC_BUILTINS (because all the atomic
>> built-ins for bool, short and int are supported), but which defines
>> _Atomic_word to some other type for which __atomic_fetch_add is _not_
>> supported. For such a target, we would previously have used inline calls
>> to __atomic_fetch_add, which would have dependend on libatomic. After
>> this commit, we would make non-inline calls into the library where
>> __exchange_and_add and __atomic_add would use the global mutex. That
>> would be an ABI break. I don't consider that a realistic scenario,
>> because it wouldn't have made any sense to define _Atomic_word to a
>> wider type than int, when doing so would have required libatomic to make
>> libstdc++.so work. Surely such a target would have just used int for its
>> _Atomic_word type.
>>
>> The GLIBCXX_ENABLE_BACKTRACE macro currently uses the
>> glibcxx_ac_atomic_int macro defined by the checks that this commit
>> removes from GLIBCXX_ENABLE_ATOMIC_BUILTINS. That wasn't a good check
>> anyway, because libbacktrace actually depends on atomic loads+stores for
>> pointers as well as int, and for atomic stores for size_t. This commit
>> replaces the glibcxx_ac_atomic_int check with a proper test for all the
>> required atomic operations on all three of int, void* and size_t. This
>> ensures that the libbacktrace code used for std::stacktrace will either
>> use native atomics, or implement those loads and stores only in terms of
>> __sync_bool_compare_and_swap (possibly requiring that to come from
>> libatomic or elsewhere).
>>
>> libstdc++-v3/ChangeLog:
>>
>>         PR libstdc++/70560
>>         PR libstdc++/119667
>>         * acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Only check for
>>         __atomic_fetch_add on _Atomic_word.
>>         (GLIBCXX_ENABLE_BACKTRACE): Check for __atomic_load_n and
>>         __atomic_store_n on int, void* and size_t.
>>         * config.h.in: Regenerate.
>>         * configure: Regenerate.
>>         * configure.host: Fix typo in comment.
>> ---
>>
>> Tested x86_64-linux, no changes to the c++config.h results.
>> I need to do more testing on other targets.
>
> O would rename _GLIBCXX_ATOMIC_BUILTINS to _GLIBCXX_ATOMIC_WORLD_BUILTINS,
> to better reflect new reality. I have checked that it seems to be one 
> libstdc++-v3/include/ext/atomicity.h
> file change. And if I mistaken, then the rename will show all affected files 
> in commit.

That seems like a good suggestion. There's a small chance of it
breaking user code that is being naughty and referring to that macro,
e.g. this advises to unset it:

https://sources.debian.org/src/guitarix/0.46.0+dfsg-1/src/NAM/NeuralAmpModelerCore/Dependencies/eigen/doc/UsingNVCC.dox/?hl=20#L20

I'm not sure we should care about that, it's an internal macro that
users should not be referring to.

Reply via email to