https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100912
Bug ID: 100912 Summary: powerpc64le: ieee128 long double incorrectly printed when using shared libstdc++ Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: msc at linux dot ibm.com Target Milestone: --- Steps to reproduce: - Build gcc with IEEE128 as the default long double format (using GCC source revision cb6e6d5faa3f817435b6f203226fa5969d7a7264). ~/build/gcc> ~/src/gcc/configure --prefix=/home/mscastanho/usr --with-long-double-128 --with-long-double-format=ieee --build=powerpc64le-linux-gnu --host=powerpc64le-linux-gnu --target=powerpc64le-linux-gnu --enable-languages=c++ --with-glibc-version=2.33 --disable-bootstrap CC=gcc-11 CXX=g++-11 ~/build/gcc> make && make install ~/build/gcc> /home/mscastanho/usr/bin/g++ -v Using built-in specs. COLLECT_GCC=/home/mscastanho/usr/bin/g++ COLLECT_LTO_WRAPPER=/home/mscastanho/usr/libexec/gcc/powerpc64le-linux-gnu/12.0.0/lto-wrapper Target: powerpc64le-linux-gnu Configured with: /home/mscastanho/src/gcc/configure --prefix=/home/mscastanho/usr --with-long-double-128 --with-long-double-format=ieee --build=powerpc64le-linux-gnu --host=powerpc64le-linux-gnu --target=powerpc64le-linux-gnu --enable-languages=c++ --with-glibc-version=2.33 --disable-bootstrap CC=gcc-11 CXX=g++-11 Thread model: posix Supported LTO compression algorithms: zlib gcc version 12.0.0 20210604 (experimental) (GCC) - Build and run simple test program with the new compiler and libstdc++ ~/build/gcc> cat ~/test-ieee128.cpp #include <iostream> using namespace std; int main () { long double n = 1.0L; cout << n << endl; return 0; } ~/build/gcc> /home/mscastanho/usr/bin/g++ -g ~/test-ieee128.cpp -o test-shared ~/build/gcc> LD_PRELOAD=~/usr/lib64/libstdc++.so.6 ./test-shared 6.95326e-310 Here I'd expect "1" to be printed. If the same program is statically linked to libstdc++, it works as expected: mscastanho@yanny4:~/build/gcc> /home/mscastanho/usr/bin/g++ -g -static-libstdc++ ~/test-ieee128.cpp -o test-static mscastanho@yanny4:~/build/gcc> ./test-static 1 After running the two programs side-by-side under gdb, I found out they are actually calling two different symbols for vsnprintf on std::__convert_from_v. Dynamically linked binary: >>> disas _ZSt16__convert_from_vRKP15__locale_structPciPKcz Dump of assembler code for function _ZSt16__convert_from_vRKP15__locale_structPciPKcz: 0x00007ffff7d19340 <+0>: addis r2,r12,37 0x00007ffff7d19344 <+4>: addi r2,r2,-14912 => 0x00007ffff7d19348 <+8>: mflr r0 0x00007ffff7d1934c <+12>: std r29,-24(r1) 0x00007ffff7d19350 <+16>: std r30,-16(r1) 0x00007ffff7d19354 <+20>: mr r29,r6 0x00007ffff7d19358 <+24>: std r31,-8(r1) 0x00007ffff7d1935c <+28>: mr r30,r5 0x00007ffff7d19360 <+32>: mr r31,r4 0x00007ffff7d19364 <+36>: std r0,16(r1) 0x00007ffff7d19368 <+40>: stdu r1,-64(r1) 0x00007ffff7d1936c <+44>: std r7,128(r1) 0x00007ffff7d19370 <+48>: std r8,136(r1) 0x00007ffff7d19374 <+52>: std r10,152(r1) 0x00007ffff7d19378 <+56>: std r9,144(r1) 0x00007ffff7d1937c <+60>: ld r3,0(r3) 0x00007ffff7d19380 <+64>: bl 0x7ffff7d09b60 <000006bf.plt_call.__uselocale@@GLIBC_2.17> 0x00007ffff7d19384 <+68>: ld r2,24(r1) 0x00007ffff7d19388 <+72>: mr r5,r29 0x00007ffff7d1938c <+76>: mr r4,r30 0x00007ffff7d19390 <+80>: addi r6,r1,128 0x00007ffff7d19394 <+84>: mr r9,r3 0x00007ffff7d19398 <+88>: mr r3,r31 0x00007ffff7d1939c <+92>: mr r30,r9 0x00007ffff7d193a0 <+96>: bl 0x7ffff7d112a0 <000006bf.plt_call.vsnprintf@@GLIBC_2.17> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 0x00007ffff7d193a4 <+100>: ld r2,24(r1) 0x00007ffff7d193a8 <+104>: mr r31,r3 0x00007ffff7d193ac <+108>: mr r3,r30 0x00007ffff7d193b0 <+112>: bl 0x7ffff7d09b60 <000006bf.plt_call.__uselocale@@GLIBC_2.17> 0x00007ffff7d193b4 <+116>: ld r2,24(r1) 0x00007ffff7d193b8 <+120>: addi r1,r1,64 0x00007ffff7d193bc <+124>: mr r3,r31 0x00007ffff7d193c0 <+128>: ld r0,16(r1) 0x00007ffff7d193c4 <+132>: ld r29,-24(r1) 0x00007ffff7d193c8 <+136>: ld r30,-16(r1) 0x00007ffff7d193cc <+140>: ld r31,-8(r1) 0x00007ffff7d193d0 <+144>: mtlr r0 0x00007ffff7d193d4 <+148>: blr 0x00007ffff7d193d8 <+152>: .long 0x0 0x00007ffff7d193dc <+156>: .long 0x1000900 0x00007ffff7d193e0 <+160>: .long 0x380 End of assembler dump. Statically linked binary: >>> disas _ZSt16__convert_from_vRKP15__locale_structPciPKcz Dump of assembler code for function _ZSt16__convert_from_vRKP15__locale_structPciPKcz: 0x000000001002e470 <+0>: lis r2,4122 0x000000001002e474 <+4>: addi r2,r2,31744 => 0x000000001002e478 <+8>: mflr r0 0x000000001002e47c <+12>: std r29,-24(r1) 0x000000001002e480 <+16>: std r30,-16(r1) 0x000000001002e484 <+20>: mr r29,r6 0x000000001002e488 <+24>: std r31,-8(r1) 0x000000001002e48c <+28>: mr r30,r5 0x000000001002e490 <+32>: mr r31,r4 0x000000001002e494 <+36>: std r0,16(r1) 0x000000001002e498 <+40>: stdu r1,-64(r1) 0x000000001002e49c <+44>: std r7,128(r1) 0x000000001002e4a0 <+48>: std r8,136(r1) 0x000000001002e4a4 <+52>: std r10,152(r1) 0x000000001002e4a8 <+56>: std r9,144(r1) 0x000000001002e4ac <+60>: ld r3,0(r3) 0x000000001002e4b0 <+64>: bl 0x10003720 <0000011a.plt_call.__uselocale@@GLIBC_2.17> 0x000000001002e4b4 <+68>: ld r2,24(r1) 0x000000001002e4b8 <+72>: mr r5,r29 0x000000001002e4bc <+76>: mr r4,r30 0x000000001002e4c0 <+80>: addi r6,r1,128 0x000000001002e4c4 <+84>: mr r9,r3 0x000000001002e4c8 <+88>: mr r3,r31 0x000000001002e4cc <+92>: mr r30,r9 0x000000001002e4d0 <+96>: bl 0x10003280 <0000011a.plt_call.__vsnprintfieee128@@GLIBC_2.32> <<<<<<<<<<<<<<<<<<<<< 0x000000001002e4d4 <+100>: ld r2,24(r1) 0x000000001002e4d8 <+104>: mr r31,r3 0x000000001002e4dc <+108>: mr r3,r30 0x000000001002e4e0 <+112>: bl 0x10003720 <0000011a.plt_call.__uselocale@@GLIBC_2.17> 0x000000001002e4e4 <+116>: ld r2,24(r1) 0x000000001002e4e8 <+120>: addi r1,r1,64 0x000000001002e4ec <+124>: mr r3,r31 0x000000001002e4f0 <+128>: ld r0,16(r1) 0x000000001002e4f4 <+132>: ld r29,-24(r1) 0x000000001002e4f8 <+136>: ld r30,-16(r1) 0x000000001002e4fc <+140>: ld r31,-8(r1) 0x000000001002e500 <+144>: mtlr r0 0x000000001002e504 <+148>: blr 0x000000001002e508 <+152>: .long 0x0 0x000000001002e50c <+156>: .long 0x1000900 0x000000001002e510 <+160>: .long 0x380 End of assembler dump. Software versions used: Distro: ~/build/gcc> cat /etc/os-release NAME="openSUSE Tumbleweed" # VERSION="20210105" ID="opensuse-tumbleweed" ID_LIKE="opensuse suse" VERSION_ID="20210105" PRETTY_NAME="openSUSE Tumbleweed" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:opensuse:tumbleweed:20210105" BUG_REPORT_URL="https://bugs.opensuse.org" HOME_URL="https://www.opensuse.org/" DOCUMENTATION_URL="https://en.opensuse.org/Portal:Tumbleweed" LOGO="distributor-logo" GCC used to build the new compiler: ~/build/gcc> g++-11 -v Using built-in specs. COLLECT_GCC=g++-11 COLLECT_LTO_WRAPPER=/usr/lib64/gcc/powerpc64le-suse-linux/11/lto-wrapper Target: powerpc64le-suse-linux Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,ada,go,jit --enable-host-shared --enable-checking=release --disable-werror --with-gxx-include-dir=/usr/include/c++/11 --enable-ssp --disable-libssp --disable-libvtv --enable-cet=auto --disable-libcc1 --enable-plugin --with-bugurl=https://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --with-slibdir=/lib64 --with-system-zlib --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --with-gcc-major-version-only --enable-linker-build-id --enable-linux-futex --enable-gnu-indirect-function --program-suffix=-11 --without-system-libunwind --with-cpu=power8 --with-tune=power9 --enable-secureplt --with-long-double-128 --enable-targets=powerpcle-linux --disable-multilib --with-build-config=bootstrap-lto-lean --enable-link-mutex --build=powerpc64le-suse-linux --host=powerpc64le-suse-linux Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.0.0 20210118 (experimental) [revision 76c1dd15e4a056a59a13b2208af23a6bd67c2682] (SUSE Linux) glibc: ~/build/gcc> /lib64/libc.so.6 GNU C Library (GNU libc) release release version 2.33 (git 9826b03b74). [...] binutils: ~/build/gcc> rpm -qa binutils binutils-2.35.1-1.1.ppc64le