Fix s390 -Os iconv build

Stefan Liebler stli@linux.vnet.ibm.com
Mon Mar 5 15:36:00 GMT 2018


On 03/02/2018 06:56 PM, Joseph Myers wrote:
> Building glibc for s390 with -Os (32-bit only, with GCC 7) fails with:
> 
> In file included from ../sysdeps/s390/multiarch/8bit-generic.c:370:0,
>                   from ebcdic-at-de.c:28:
> ../iconv/loop.c: In function '__to_generic_vx':
> ../iconv/loop.c:264:22: error: 'ch' may be used uninitialized in this function [-Werror=maybe-uninitialized]
>       if (((Character) >> 7) == (0xe0000 >> 7))          \
>                        ^~
> In file included from ebcdic-at-de.c:28:0:
> ../sysdeps/s390/multiarch/8bit-generic.c:340:15: note: 'ch' was declared here
>        uint32_t ch;      \
>                 ^
> ../iconv/loop.c:325:7: note: in expansion of macro 'BODY'
>         BODY
>         ^~~~
> 
> It's fairly easy to see, looking at the (long) expansion of the BODY
> macro, that this is a false positive and the relevant variable 'ch' is
> always initialized before use, in one of two possible places.  As
> such, disabling the warning for -Os with the DIAG_* macros is the
> natural approach to fix this build failure.  However, because of the
> location at which the warning is reported, the disabling needs to go
> in iconv/loop.c, around the definition of UNICODE_TAG_HANDLER (not
> inside the definition), as that macro definition is where the
> uninitialized use is reported, whereas the code that needs to be
> reasoned about to see that the warning is a false positive is in the
> definition of BODY elsewhere.
> 
> Thus, the patch adds such disabling in iconv/loop.c, with a comment
> pointing to the s390-specific code and a comment in the s390-specific
> code pointing to the generic file to alert people to the possible need
> to update one place when changing the other.  It would be possible if
> desired to use #ifdef __s390__ around the disabling, though in general
> we try to avoid that sort of thing in generic files.  (Or some
> extremely specialized macros for "disable -Wmaybe-uninitialized in
> this particular place" could be specified, defined to 0 in a lot of
> different files that include iconv/loop.c and to 1 in that particular
> s390 file.)
> 
> Tested that this fixed -Os compilation for s390-linux-gnu with
> build-many-glibcs.py.
> 
Build locally on s390 / s390x with -Os / -O3.
This patch suppresses the Werror in all these mentioned cases.
 From s390 perspective, this patch is okay.

Thanks.
Stefan



More information about the Libc-alpha mailing list