Port-mips archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
__atomic_test_and_set() and mips o32 - help wanted
hi folks.
one of the GCC 14 issues is that for mips o32, libstdc++ tries to
use a newer-ish builtin called __atomic_test_and_set(), that ends
up emitting a call to a library function on o32, which leads to a
link failure in gdb (and more).
this library function is defined as:
bool __atomic_test_and_set(bool *ptr, int memorder);
where "memorder" is from <stdatomic.h> and is eg,
"memory_order_relaxed", or "memory_order_consume", or a few other
options.
using -abi=n32 or -abi=64 generates a bunch of code using ll/sc,
and some ugly crap to only operate on one byte. the n32 one is:
https://www.netbsd.org/~mrg/mips-n32-atomic_test_and_set.s
the libstdc++ direct calls to __atomic_test_and_set() are in:
external/gpl3/gcc/dist/libstdc++-v3/include/bits/atomic_base.h
there is a _GLIBCXX_ATOMIC_BUILTINS define that should be able
to implement these differently if possible..
the same problem exists on sh3, but there's a workaround i just
seem to have tested (sh3 and sh4 cpus support tas.b instruction,
but gcc wants "-mtas" to enable it.)
i'm not sure what the right thing to do here is. it's not clear
to me that the actual old 32-bit hardware can do this at all, but
there are now explicit calls to this builtin. GCC configury tries
to find and notice it's missing, but libstdc++ still has a couple
of calls to it directly in it's "test_and_set()".
anyone have a good idea?
.mrg.
Home |
Main Index |
Thread Index |
Old Index