Bug 103146 - [12 Regression] libstdc++-v3 bootstrap failure on 32-bit BE powerpc since r12-4952
Summary: [12 Regression] libstdc++-v3 bootstrap failure on 32-bit BE powerpc since r12...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libstdc++ (show other bugs)
Version: 12.0
: P1 normal
Target Milestone: 12.0
Assignee: Jonathan Wakely
URL:
Keywords: build
Depends on:
Blocks:
 
Reported: 2021-11-09 04:26 UTC by Arseny Solokha
Modified: 2021-12-13 13:42 UTC (History)
0 users

See Also:
Host:
Target: powerpc-e300c3-linux-gnu
Build:
Known to work:
Known to fail:
Last reconfirmed: 2021-11-09 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Arseny Solokha 2021-11-09 04:26:42 UTC
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?
Comment 1 Andrew Pinski 2021-11-09 07:31:20 UTC
(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.
Comment 2 GCC Commits 2021-11-09 15:14:04 UTC
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__.
Comment 3 Jonathan Wakely 2021-11-09 15:16:15 UTC
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.