mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Bug 20729: Fix building with -Os.
This commit adds a new DIAG_IGNORE_Os_NEEDS_COMMENT which is only enabled when compiling with -Os. This allows developers working on -Os enabled builds to mark false-positive warnings without impacting the warnings emitted at -O2. Then using the new DIAG_IGNORE_Os_NEEDS_COMMENT we fix 6 warnings generated with GCC 5 to get -Os builds working again.
This commit is contained in:
16
ChangeLog
16
ChangeLog
@ -1,5 +1,21 @@
|
|||||||
2016-10-28 Carlos O'Donell <carlos@redhat.com>
|
2016-10-28 Carlos O'Donell <carlos@redhat.com>
|
||||||
|
|
||||||
|
[BZ #20729]
|
||||||
|
* include/libc-internal.h (DIAG_IGNORE_Os_NEEDS_COMMENT):
|
||||||
|
Define.
|
||||||
|
* iso-2022-cn-ext.c: Include libc-internal.h and ignore
|
||||||
|
-Wmaybe-uninitialized for BODY macro only for -Os compiles.
|
||||||
|
* locale/weight.h (findix): Ignore -Wmaybe-uninitialized error
|
||||||
|
for seq2.back_us and seq1.back_us only for -Os compiles.
|
||||||
|
* locale/weightwc.h (findix): Likewise.
|
||||||
|
* nptl_db/thread_dbP.h: Ignore -Wmaybe-uninitialized error for
|
||||||
|
DB_GET_FIELD_ADDRESS only for -Os compiles.
|
||||||
|
* resolv/res_send (reopen): Ignore -Wmaybe-uninitialized error
|
||||||
|
for slen only for -Os compiles.
|
||||||
|
* string/strcoll_l.c (get_next_seq): Ignore
|
||||||
|
-Wmaybe-uninitialized for seq2.save_idx and seq1.save_idx only
|
||||||
|
for -Os compiles.
|
||||||
|
|
||||||
* elf/Makefile (CFALGS-tst-linkall-static): Remove.
|
* elf/Makefile (CFALGS-tst-linkall-static): Remove.
|
||||||
* include/crypt.h: New file.
|
* include/crypt.h: New file.
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "cns11643.h"
|
#include "cns11643.h"
|
||||||
#include "cns11643l1.h"
|
#include "cns11643l1.h"
|
||||||
#include "cns11643l2.h"
|
#include "cns11643l2.h"
|
||||||
|
#include <libc-internal.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@ -394,6 +395,16 @@ enum
|
|||||||
#define MIN_NEEDED_OUTPUT TO_LOOP_MIN_NEEDED_TO
|
#define MIN_NEEDED_OUTPUT TO_LOOP_MIN_NEEDED_TO
|
||||||
#define MAX_NEEDED_OUTPUT TO_LOOP_MAX_NEEDED_TO
|
#define MAX_NEEDED_OUTPUT TO_LOOP_MAX_NEEDED_TO
|
||||||
#define LOOPFCT TO_LOOP
|
#define LOOPFCT TO_LOOP
|
||||||
|
/* With GCC 5.3 when compiling with -Os the compiler emits a warning
|
||||||
|
that buf[0] and buf[1] may be used uninitialized. This can only
|
||||||
|
happen in the case where tmpbuf[3] is used, and in that case the
|
||||||
|
write to the tmpbuf[1] and tmpbuf[2] was assured because
|
||||||
|
ucs4_to_cns11643 would have filled in those entries. The difficulty
|
||||||
|
is in getting the compiler to see this logic because tmpbuf[0] is
|
||||||
|
involved in determining the code page and is the indicator that
|
||||||
|
tmpbuf[2] is initialized. */
|
||||||
|
DIAG_PUSH_NEEDS_COMMENT;
|
||||||
|
DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
||||||
#define BODY \
|
#define BODY \
|
||||||
{ \
|
{ \
|
||||||
uint32_t ch; \
|
uint32_t ch; \
|
||||||
@ -645,6 +656,7 @@ enum
|
|||||||
/* Now that we wrote the output increment the input pointer. */ \
|
/* Now that we wrote the output increment the input pointer. */ \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
#define EXTRA_LOOP_DECLS , int *setp
|
#define EXTRA_LOOP_DECLS , int *setp
|
||||||
#define INIT_PARAMS int set = (*setp >> 3) & CURRENT_MASK; \
|
#define INIT_PARAMS int set = (*setp >> 3) & CURRENT_MASK; \
|
||||||
int ann = (*setp >> 3) & ~CURRENT_MASK
|
int ann = (*setp >> 3) & ~CURRENT_MASK
|
||||||
|
@ -111,4 +111,19 @@ extern __typeof (__profile_frequency) __profile_frequency attribute_hidden;
|
|||||||
#define DIAG_IGNORE_NEEDS_COMMENT(version, option) \
|
#define DIAG_IGNORE_NEEDS_COMMENT(version, option) \
|
||||||
_Pragma (_DIAG_STR (GCC diagnostic ignored option))
|
_Pragma (_DIAG_STR (GCC diagnostic ignored option))
|
||||||
|
|
||||||
|
/* Similar to DIAG_IGNORE_NEEDS_COMMENT the following macro ignores the
|
||||||
|
diagnostic OPTION but only if optimizations for size are enabled.
|
||||||
|
This is required because different warnings may be generated for
|
||||||
|
different optimization levels. For example a key piece of code may
|
||||||
|
only generate a warning when compiled at -Os, but at -O2 you could
|
||||||
|
still want the warning to be enabled to catch errors. In this case
|
||||||
|
you would use DIAG_IGNORE_Os_NEEDS_COMMENT to disable the warning
|
||||||
|
only for -Os. */
|
||||||
|
#ifdef __OPTIMIZE_SIZE__
|
||||||
|
# define DIAG_IGNORE_Os_NEEDS_COMMENT(version, option) \
|
||||||
|
_Pragma (_DIAG_STR (GCC diagnostic ignored option))
|
||||||
|
#else
|
||||||
|
# define DIAG_IGNORE_Os_NEEDS_COMMENT(version, option)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _LIBC_INTERNAL */
|
#endif /* _LIBC_INTERNAL */
|
||||||
|
@ -61,9 +61,17 @@ findidx (const int32_t *table,
|
|||||||
already. */
|
already. */
|
||||||
size_t cnt;
|
size_t cnt;
|
||||||
|
|
||||||
|
/* With GCC 5.3 when compiling with -Os the compiler warns
|
||||||
|
that seq2.back_us, which becomes usrc, might be used
|
||||||
|
uninitialized. This can't be true because we pass a length
|
||||||
|
of -1 for len at the same time which means that this loop
|
||||||
|
never executes. */
|
||||||
|
DIAG_PUSH_NEEDS_COMMENT;
|
||||||
|
DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
||||||
for (cnt = 0; cnt < nhere && cnt < len; ++cnt)
|
for (cnt = 0; cnt < nhere && cnt < len; ++cnt)
|
||||||
if (cp[cnt] != usrc[cnt])
|
if (cp[cnt] != usrc[cnt])
|
||||||
break;
|
break;
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
|
|
||||||
if (cnt == nhere)
|
if (cnt == nhere)
|
||||||
{
|
{
|
||||||
|
@ -59,9 +59,17 @@ findidx (const int32_t *table,
|
|||||||
already. */
|
already. */
|
||||||
size_t cnt;
|
size_t cnt;
|
||||||
|
|
||||||
|
/* With GCC 5.3 when compiling with -Os the compiler warns
|
||||||
|
that seq2.back_us, which becomes usrc, might be used
|
||||||
|
uninitialized. This can't be true because we pass a length
|
||||||
|
of -1 for len at the same time which means that this loop
|
||||||
|
never executes. */
|
||||||
|
DIAG_PUSH_NEEDS_COMMENT;
|
||||||
|
DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
||||||
for (cnt = 0; cnt < nhere && cnt < len; ++cnt)
|
for (cnt = 0; cnt < nhere && cnt < len; ++cnt)
|
||||||
if (cp[cnt] != usrc[cnt])
|
if (cp[cnt] != usrc[cnt])
|
||||||
break;
|
break;
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
|
|
||||||
if (cnt == nhere)
|
if (cnt == nhere)
|
||||||
{
|
{
|
||||||
|
@ -160,10 +160,19 @@ extern ps_err_e td_mod_lookup (struct ps_prochandle *ps, const char *modname,
|
|||||||
SYM_##type##_FIELD_##field, \
|
SYM_##type##_FIELD_##field, \
|
||||||
(psaddr_t) 0 + (idx), (ptr), &(var))
|
(psaddr_t) 0 + (idx), (ptr), &(var))
|
||||||
|
|
||||||
|
/* With GCC 5.3 when compiling with -Os the compiler emits a warning
|
||||||
|
that slot may be used uninitialized. This is never the case since
|
||||||
|
the dynamic loader initializes the slotinfo list and
|
||||||
|
dtv_slotinfo_list will point slot at the first entry. Therefore
|
||||||
|
when DB_GET_FIELD_ADDRESS is called with a slot for ptr, the slot is
|
||||||
|
always initialized. */
|
||||||
|
DIAG_PUSH_NEEDS_COMMENT;
|
||||||
|
DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
||||||
#define DB_GET_FIELD_ADDRESS(var, ta, ptr, type, field, idx) \
|
#define DB_GET_FIELD_ADDRESS(var, ta, ptr, type, field, idx) \
|
||||||
((var) = (ptr), _td_locate_field ((ta), (ta)->ta_field_##type##_##field, \
|
((var) = (ptr), _td_locate_field ((ta), (ta)->ta_field_##type##_##field, \
|
||||||
SYM_##type##_FIELD_##field, \
|
SYM_##type##_FIELD_##field, \
|
||||||
(psaddr_t) 0 + (idx), &(var)))
|
(psaddr_t) 0 + (idx), &(var)))
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
|
|
||||||
extern td_err_e _td_locate_field (td_thragent_t *ta,
|
extern td_err_e _td_locate_field (td_thragent_t *ta,
|
||||||
db_desc_t desc, int descriptor_name,
|
db_desc_t desc, int descriptor_name,
|
||||||
|
@ -664,7 +664,7 @@ send_vc(res_state statp,
|
|||||||
a false-positive.
|
a false-positive.
|
||||||
*/
|
*/
|
||||||
DIAG_PUSH_NEEDS_COMMENT;
|
DIAG_PUSH_NEEDS_COMMENT;
|
||||||
DIAG_IGNORE_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
||||||
int resplen;
|
int resplen;
|
||||||
DIAG_POP_NEEDS_COMMENT;
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
struct iovec iov[4];
|
struct iovec iov[4];
|
||||||
@ -930,7 +930,16 @@ reopen (res_state statp, int *terrno, int ns)
|
|||||||
* error message is received. We can thus detect
|
* error message is received. We can thus detect
|
||||||
* the absence of a nameserver without timing out.
|
* the absence of a nameserver without timing out.
|
||||||
*/
|
*/
|
||||||
|
/* With GCC 5.3 when compiling with -Os the compiler
|
||||||
|
emits a warning that slen may be used uninitialized,
|
||||||
|
but that is never true. Both slen and
|
||||||
|
EXT(statp).nssocks[ns] are initialized together or
|
||||||
|
the function return -1 before control flow reaches
|
||||||
|
the call to connect with slen. */
|
||||||
|
DIAG_PUSH_NEEDS_COMMENT;
|
||||||
|
DIAG_IGNORE_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
||||||
if (connect(EXT(statp).nssocks[ns], nsap, slen) < 0) {
|
if (connect(EXT(statp).nssocks[ns], nsap, slen) < 0) {
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
Aerror(statp, stderr, "connect(dg)", errno, nsap);
|
Aerror(statp, stderr, "connect(dg)", errno, nsap);
|
||||||
__res_iclose(statp, false);
|
__res_iclose(statp, false);
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
#include <libc-internal.h>
|
||||||
|
|
||||||
#ifndef STRING_TYPE
|
#ifndef STRING_TYPE
|
||||||
# define STRING_TYPE char
|
# define STRING_TYPE char
|
||||||
@ -170,7 +171,19 @@ get_next_seq (coll_seq *seq, int nrules, const unsigned char *rulesets,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* With GCC 5.3 when compiling with -Os the compiler complains
|
||||||
|
that idx, taken from seq->idx (seq1 or seq2 from STRCOLL) may
|
||||||
|
be used uninitialized. In general this can't possibly be true
|
||||||
|
since seq1.idx and seq2.idx are initialized to zero in the
|
||||||
|
outer function. Only one case where seq->idx is restored from
|
||||||
|
seq->save_idx might result in an uninitialized idx value, but
|
||||||
|
it is guarded by a sequence of checks against backw_stop which
|
||||||
|
ensures that seq->save_idx was saved to first and contains a
|
||||||
|
valid value. */
|
||||||
|
DIAG_PUSH_NEEDS_COMMENT;
|
||||||
|
DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
||||||
len = weights[idx++];
|
len = weights[idx++];
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
/* Skip over indices of previous levels. */
|
/* Skip over indices of previous levels. */
|
||||||
for (int i = 0; i < pass; i++)
|
for (int i = 0; i < pass; i++)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user