https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113907

            Bug ID: 113907
           Summary: [14 regression] ICU miscompiled since on x86 since
                    r14-5109-ga291237b628f41
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sjames at gcc dot gnu.org
                CC: amacleod at redhat dot com, arsen at gcc dot gnu.org
  Target Milestone: ---

Originally reported downstream in Gentoo at https://bugs.gentoo.org/924153.

ICU seems miscompiled on x86 (-m32) since r14-5109-ga291237b628f41. My C++ is
~non-existent so I can't reduce it. I appreciate this isn't a great level of
detail.

It crashes during the build when running a just-built executable:
```
i686-pc-linux-gnu-g++ -D_REENTRANT -DU_DEBUG=1 -DU_HAVE_ELF_H=1
-DU_HAVE_STRTOD_L=1 -DU_HAVE_XLOCALE_H=0 -DU_DISABLE_RENAMING=1
-I/var/tmp/portage/dev-libs/icu-74.2/work/icu/source/common
-I/var/tmp/portage/dev-libs/icu-74.2/work/icu/source/tools/icupkg/../toolutil
-DU_ATTRIBUTE_DEPRECATED= -O2 -march=i686 -pipe -pipe -frecord-gcc-switches
-fno-diagnostics-color -fmessage-length=0 -std=c++14 -W -Wall -pedantic
-Wpointer-arith -Wwrite-strings -Wno-long-long -c -o icupkg.o
/var/tmp/portage/dev-libs/icu-74.2/work/icu/source/tools/icupkg/icupkg.cpp
[..]
i686-pc-linux-gnu-g++ -O2 -march=i686 -pipe -pipe -frecord-gcc-switches
-fno-diagnostics-color -fmessage-length=0 -std=c++14 -W -Wall -pedantic
-Wpointer-arith -Wwrite-strings -Wno-long-long   -Wl,-O1 -Wl,--as-needed
-Wl,--defsym=__gentoo_check_ldflags__=0   -o ../../bin/icupkg icupkg.o
-L../../lib -licutu -L../../lib -licui18n -L../../lib -licuuc -L../../stubdata
-licudata -lpthread -lm  
[...]
Unpacking
/var/tmp/portage/dev-libs/icu-74.2/work/icu/source/data/in/icudt74l.dat and
generating out/tmp/icudata.lst (list of data files)
LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH 
../bin/icupkg -d ./out/build/icudt74l --list -x \*
/var/tmp/portage/dev-libs/icu-74.2/work/icu/source/data/in/icudt74l.dat -o
out/tmp/icudata.lst
make[1]: *** [Makefile:272: out/tmp/icudata.lst] Segmentation fault
make[1]: *** Waiting for unfinished jobs....
make[2]: Leaving directory
'/var/tmp/portage/dev-libs/icu-74.2/work/icu/source-abi_x86_32.x86/data'
make[1]: Leaving directory
'/var/tmp/portage/dev-libs/icu-74.2/work/icu/source-abi_x86_32.x86/data'
make: *** [Makefile:153: all-recursive] Error 2
 * ERROR: dev-libs/icu-74.2::gentoo failed (compile phase):
 *   emake failed
```

Valgrind says:
```
==26485== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==26485== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==26485== Command: ../bin/icupkg -d ./out/build/icudt74l --list -x *
/var/tmp/portage/dev-libs/icu-74.1/work/icu/source/data/in/icudt74l.dat -o
out/tmp/icudata.lst
==26485==
==26485== Invalid write of size 1
==26485==    at 0x52A0110: memcpy (string_fortified.h:29)
==26485==    by 0x52A0110: uprv_copyArray64 (udataswp.cpp:172)
==26485==    by 0x52A0110: uprv_copyArray16(UDataSwapper const*, void const*,
int, void*, UErrorCode*) (udataswp.cpp:160)
==26485==    by 0x52A0630: udata_swapDataHeader (udataswp.cpp:342)
==26485==    by 0x48694F1: icu::Package::readPackage(char const*)
(package.cpp:483)
==26485==    by 0x10987F: main (icupkg.cpp:335)
==26485==  Address 0x54f2458 is 0 bytes after a block of size 201,216 alloc'd
==26485==    at 0x4842E4D: operator new(unsigned int) (vg_replace_malloc.c:476)
==26485==    by 0x10936B: main (icupkg.cpp:285)
```

Manual reproduction steps:
```
./configure CC="gcc -m32" CXX="g++ -m32" CFLAGS="-O2 -ggdb3 -march=i686"
CXXFLAGS="-O2 -ggdb3 -march=i686" --disable-renaming --disable-layoutex
--disable-samples
make -j$(nproc)
```

There's some suspicious code there wrt reinterpret_cast but
-fno-strict-aliasing doesn't help. It's fine with -O1, but not -O2.

Reply via email to