aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--string/wordcopy.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/string/wordcopy.c b/string/wordcopy.c
index ae5ccd793c..a8a40c9f01 100644
--- a/string/wordcopy.c
+++ b/string/wordcopy.c
@@ -19,7 +19,19 @@
/* BE VERY CAREFUL IF YOU CHANGE THIS CODE...! */
#include <stddef.h>
+#include <libc-diag.h>
+/* Compiling with -O1 might warn that 'a2' and 'a3' may be used
+ uninitialized. There are only two ways to arrive at labels 'do4', 'do3'
+ or 'do1', all of which use 'a2' or 'a3' in the MERGE macro: either from
+ the earlier switch case statement or via a loop iteration. In all cases
+ the switch statement or previous loop sets both 'a2' and 'a3'.
+
+ Since the usage is within the MERGE macro we disable the
+ warning in the definition, but only in this file. */
+DIAG_PUSH_NEEDS_COMMENT;
+DIAG_IGNORE_NEEDS_COMMENT (6, "-Wmaybe-uninitialized");
#include <memcopy.h>
+DIAG_POP_NEEDS_COMMENT;
/* _wordcopy_fwd_aligned -- Copy block beginning at SRCP to
block beginning at DSTP with LEN `op_t' words (not LEN bytes!).
@@ -94,7 +106,15 @@ WORDCOPY_FWD_ALIGNED (long int dstp, long int srcp, size_t len)
{
do8:
a0 = ((op_t *) srcp)[0];
+ /* Compiling with -O1 may warn that 'a1' may be used uninitialized.
+ There are only two ways to arrive at label 'do8' and they are via a
+ do-while loop iteration or directly via the earlier switch 'case 1:'
+ case. The switch case always sets 'a1' and all previous loop
+ iterations will also have set 'a1' before the use. */
+ DIAG_PUSH_NEEDS_COMMENT;
+ DIAG_IGNORE_NEEDS_COMMENT (6, "-Wmaybe-uninitialized");
((op_t *) dstp)[0] = a1;
+ DIAG_POP_NEEDS_COMMENT;
do7:
a1 = ((op_t *) srcp)[1];
((op_t *) dstp)[1] = a0;
@@ -291,7 +311,11 @@ WORDCOPY_BWD_ALIGNED (long int dstp, long int srcp, size_t len)
{
do8:
a0 = ((op_t *) srcp)[7];
+ /* Check the comment on WORDCOPY_FWD_ALIGNED. */
+ DIAG_PUSH_NEEDS_COMMENT;
+ DIAG_IGNORE_NEEDS_COMMENT (6, "-Wmaybe-uninitialized");
((op_t *) dstp)[7] = a1;
+ DIAG_POP_NEEDS_COMMENT;
do7:
a1 = ((op_t *) srcp)[6];
((op_t *) dstp)[6] = a0;