[v3] atomics
David Daney
ddaney@avtrex.com
Sat Apr 19 00:08:00 GMT 2008
Benjamin Kosnik wrote:
>> The problem is that MIPS only supports atomic operations on 32 bit
>> wide locations (and 64 for mips64). src/atomic.cc appears to be
>> trying to generate code for operations on 8 bit wide locations thus
>> generating calls to __sync_lock_test_and_set_1 as the operation can
>> not be expanded. Since there is no __sync_lock_test_and_set_1
>> anything that links against libstdc++.so fails to link (most of the
>> c++ and libstdc++ testsuite for example).
>
> I see.
>
> The problem is that _GLIBCXX_ATOMIC_BUILTINS is defined, so that
> the __sync_* builtin path is used in atomic.cc.
>
> However, in acinclude.m4's GLIBCXX_ENABLE_ATOMIC_BUILTINS, the use of
> __sync_lock_test_and_set(&(__a->_M_base._M_b), 1);
>
> is not tested, only
>
> // NB: _Atomic_word not necessarily int.
> typedef int atomic_type;
> atomic_type c1;
> atomic_type c2;
> const atomic_type c3(0);
> if (__sync_fetch_and_add(&c1, c2) == c3)
>
> So, adding something like:
>
> Index: acinclude.m4
> ===================================================================
> --- acinclude.m4 (revision 134441)
> +++ acinclude.m4 (working copy)
> @@ -2288,6 +2288,11 @@
> {
> // Do something.
> }
> +
> + typedef bool atomic_bool;
> + atomic_bool b1;
> + __sync_lock_test_and_set(&b1, 1);
> +
> return 0;
> }
>
> Will fix it in configure, at the expense of all other atomic builtins
> used by libstdc++ on mips...
This doesn't work as this is a compile test not a link test. The
failure happens at link time as the __sync_lock_test_and_set is expanded
to a lib call if it cannot be expanded in-line.
I'm sure that a link test could be created, but I think that for mips I
will just add the patterns so that it works as intended. I'm not sure
how other targets will be effected.
David Daney
More information about the Gcc-patches
mailing list