libstdc++-v3 shipped w/ gcc-12.0.0-alpha20211107 snapshot (g:962ff7d2849e1fa6a1fe0535aa2dec5c2b9a32a6) fails to build because of missing __builtin_darn(): libtool: compile: /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/build/./gcc/xgcc -shared-libgcc -B/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/build/./gcc -nostdinc++ -L/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/build/powerpc-e300c3-linux-gnu/libstdc++-v3/src -L/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/build/powerpc-e300c3-linux-gnu/libstdc++-v3/src/.libs -L/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/build/powerpc-e300c3-linux-gnu/libstdc++-v3/libsupc++/.libs -B/usr/powerpc-e300c3-linux-gnu/bin/ -B/usr/powerpc-e300c3-linux-gnu/lib/ -isystem /usr/powerpc-e300c3-linux-gnu/include -isystem /usr/powerpc-e300c3-linux-gnu/sys-include -I/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/gcc-12-20211107/libstdc++-v3/../libgcc -I/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/build/powerpc-e300c3-linux-gnu/libstdc++-v3/include/powerpc-e300c3-linux-gnu -I/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/build/powerpc-e300c3-linux-gnu/libstdc++-v3/include -I/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/gcc-12-20211107/libstdc++-v3/libsupc++ -std=gnu++11 -D_GLIBCXX_SHARED -fno-implicit-templates -Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2 -fdiagnostics-show-location=once -ffunction-sections -fdata-sections -frandom-seed=random.lo -g -O2 -D_GNU_SOURCE -c /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/gcc-12-20211107/libstdc++-v3/src/c++11/random.cc -fPIC -DPIC -D_GLIBCXX_SHARED -o random.o /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/gcc-12-20211107/libstdc++-v3/src/c++11/random.cc: In function 'unsigned int std::{anonymous}::__ppc_darn(void*)': /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-12.0.0_alpha20211107/work/gcc-12-20211107/libstdc++-v3/src/c++11/random.cc:147:22: error: '__builtin_darn' was not declared in this scope; did you mean '__builtin_tan'? 147 | uint64_t val = __builtin_darn(); | ^~~~~~~~~~~~~~ | __builtin_tan Is the corresponding check really sufficient for PowerISA before 3.0?
(In reply to Arseny Solokha from comment #0) > Is the corresponding check really sufficient for PowerISA before 3.0? Hmm: #ifdef USE_DARN unsigned int __attribute__((target("cpu=power9"))) __ppc_darn(void*) { const uint64_t failed = -1; unsigned int retries = 10; uint64_t val = __builtin_darn(); while (val == failed) [[__unlikely__]] { if (--retries == 0) std::__throw_runtime_error(__N("random_device: darn failed")); val = __builtin_darn(); } return (uint32_t)val; } #endif BU_P9_MISC_0 (DARN_32, "darn_32", MISC, darn_32) BU_P9_64BIT_MISC_0 (DARN_RAW, "darn_raw", MISC, darn_raw) BU_P9_64BIT_MISC_0 (DARN, "darn", MISC, darn) Confirmed. __builtin_darn is only enabled for 64bit while __builtin_darn_32 is enabled for both.
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>: https://gcc.gnu.org/g:d9ebf0ce0845046cdd0cb40c598072bd1d91362c commit r12-5057-gd9ebf0ce0845046cdd0cb40c598072bd1d91362c Author: Jonathan Wakely <jwakely@redhat.com> Date: Tue Nov 9 09:34:23 2021 +0000 libstdc++: Do not use 64-bit DARN on 32-bit powerpc [PR103146] We need to use the 64-bit DARN to detect failure without bias, but it's not available in 32-bit mode. libstdc++-v3/ChangeLog: PR libstdc++/103146 * src/c++11/random.cc: Check __powerpc64__ not __powerpc__.
It should be fixed, but I don't have a power64 BE machine with a new-enough glibc to check it. Please reopen this bug if it's still a problem.