[v2] signal: Deprecate additional legacy signal handling functions

Message ID 87pnb6qpw5.fsf@oldenburg2.str.redhat.com
State Committed
Headers
Series [v2] signal: Deprecate additional legacy signal handling functions |

Commit Message

Florian Weimer May 14, 2020, 7:26 p.m. UTC
  This needs a few test adjustments: In some cases, sigignore was
used for convenience (replaced with xsignal with SIG_IGN).  Tests
for the deprecated functions need to disable
-Wdeprecated-declarations, and for the sigmask deprecation,
-Wno-error.

---
Changes since v1:
 Use <libc-diag.h>
 Deprecate siginterrupt, sigmask
 Mention alternative functions in the manual

 NEWS                   |  5 +++++
 manual/signal.texi     |  6 ++++++
 nptl/Makefile          |  7 +++++++
 nptl/tst-cancel4.c     |  7 +++++++
 nptl/tst-exec1.c       |  7 ++-----
 nptl/tst-exec2.c       |  7 ++-----
 nptl/tst-exec3.c       |  7 ++-----
 nptl/tst-exec4.c       |  8 ++------
 nptl/tst-exec5.c       |  6 +-----
 signal/signal.h        | 23 ++++++++++++++++-------
 signal/tst-sigset2.c   |  4 ++++
 signal/tst-sigsimple.c |  3 +++
 12 files changed, 57 insertions(+), 33 deletions(-)
  

Comments

Adhemerval Zanella Netto May 20, 2020, 7:58 p.m. UTC | #1
On 14/05/2020 16:26, Florian Weimer via Libc-alpha wrote:
> This needs a few test adjustments: In some cases, sigignore was
> used for convenience (replaced with xsignal with SIG_IGN).  Tests
> for the deprecated functions need to disable
> -Wdeprecated-declarations, and for the sigmask deprecation,
> -Wno-error.
> 

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
> Changes since v1:
>  Use <libc-diag.h>
>  Deprecate siginterrupt, sigmask
>  Mention alternative functions in the manual
> 
>  NEWS                   |  5 +++++
>  manual/signal.texi     |  6 ++++++
>  nptl/Makefile          |  7 +++++++
>  nptl/tst-cancel4.c     |  7 +++++++
>  nptl/tst-exec1.c       |  7 ++-----
>  nptl/tst-exec2.c       |  7 ++-----
>  nptl/tst-exec3.c       |  7 ++-----
>  nptl/tst-exec4.c       |  8 ++------
>  nptl/tst-exec5.c       |  6 +-----
>  signal/signal.h        | 23 ++++++++++++++++-------
>  signal/tst-sigset2.c   |  4 ++++
>  signal/tst-sigsimple.c |  3 +++
>  12 files changed, 57 insertions(+), 33 deletions(-)
> 
> diff --git a/NEWS b/NEWS
> index 141078c319..fb46af2dd3 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -35,6 +35,11 @@ Deprecated and removed features, and other changes affecting compatibility:
>    Its implementation always returned with a failure, and the function
>    was not declared in any header file.
>  
> +* The legacy signal handling functions siginterrupt, sigpause, sighold,
> +  sigrelse, sigignore and sigset, and the sigmask macro have been
> +  deprecated.  Applications should use the sigsuspend, sigprocmask and
> +  sigaction functions instead.
> +
>  Changes to build and runtime requirements:
>  
>  * powerpc64le requires GCC 7.4 or newer.  This is required for supporting

Ok.

> diff --git a/manual/signal.texi b/manual/signal.texi
> index 33e6646975..911b422a18 100644
> --- a/manual/signal.texi
> +++ b/manual/signal.texi
> @@ -3250,6 +3250,9 @@ are interrupted by handling signal @var{signum}.  If @var{failflag} is
>  false, signal @var{signum} restarts primitives.  If @var{failflag} is
>  true, handling @var{signum} causes these primitives to fail with error
>  code @code{EINTR}.  @xref{Interrupted Primitives}.
> +
> +This function has been replaced by the @code{SA_RESTART} flag of the
> +@code{sigaction} function.  @xref{Advanced Signal Handling}.
>  @end deftypefun
>  
>  @deftypefn Macro int sigmask (int @var{signum})

Ok.

> @@ -3267,6 +3270,9 @@ together to specify more than one signal.  For example,
>  
>  @noindent
>  specifies a mask that includes all the job-control stop signals.
> +
> +This macro has been replaced by the @code{sigset_t} type and the
> +associated signal set manipulation functions.  @xref{Signal Sets}.
>  @end deftypefn
>  
>  @deftypefun int sigblock (int @var{mask})

Ok.

> diff --git a/nptl/Makefile b/nptl/Makefile
> index ef9a6eb561..105ae50301 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -501,6 +501,13 @@ endif
>  # function frequently to get a thread-specific handle.
>  CFLAGS-pthread_self.os += -fomit-frame-pointer
>  
> +# The sigmask macro is deprecated and triggers are compiler warning
> +# which cannot be suppressed (as of GCC 9).
> +CFLAGS-tst-cancel4.c += -Wno-error
> +CFLAGS-tst-cancel5.c += -Wno-error
> +CFLAGS-tst-cancelx4.c += -Wno-error
> +CFLAGS-tst-cancelx5.c += -Wno-error
> +

Ok.

>  # Run the cancellation and cleanup tests also for the modern, exception-based
>  # implementation.  For this we have to pass the -fexceptions parameter.
>  CFLAGS-tst-cancelx2.c += -fexceptions
> diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c
> index 652668537a..be7a48e253 100644
> --- a/nptl/tst-cancel4.c
> +++ b/nptl/tst-cancel4.c
> @@ -39,6 +39,7 @@
>  #include <sys/wait.h>
>  #include <sys/stat.h>
>  #include <sys/uio.h>
> +#include <libc-diag.h>
>  
>  
>  /* Since STREAMS are not supported in the standard Linux kernel and
> @@ -527,7 +528,13 @@ tf_sigpause (void *arg)
>  
>    pthread_cleanup_push (cl, NULL);
>  
> +  /* This tests the deprecated sigpause and sigmask functions.  The
> +     file is compiled with -Wno-errno so that the sigmask deprecation
> +     warning is not fatal.  */
> +  DIAG_PUSH_NEEDS_COMMENT;
> +  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
>    sigpause (sigmask (SIGINT));
> +  DIAG_POP_NEEDS_COMMENT;
>  
>    pthread_cleanup_pop (0);
>  

Ok.

> diff --git a/nptl/tst-exec1.c b/nptl/tst-exec1.c
> index e1a5baa41f..892107d4c7 100644
> --- a/nptl/tst-exec1.c
> +++ b/nptl/tst-exec1.c
> @@ -27,6 +27,7 @@
>  #include <stdlib.h>
>  #include <unistd.h>
>  #include <sys/wait.h>
> +#include <support/xsignal.h>
>  
>  
>  static void *
> @@ -56,11 +57,7 @@ do_test (void)
>      }
>  
>    /* Not interested in knowing when the pipe is closed.  */
> -  if (sigignore (SIGPIPE) != 0)
> -    {
> -      puts ("sigignore failed");
> -      exit (1);
> -    }
> +  xsignal (SIGPIPE, SIG_IGN);
>  
>    posix_spawn_file_actions_t a;
>    if (posix_spawn_file_actions_init (&a) != 0)

Ok.

> diff --git a/nptl/tst-exec2.c b/nptl/tst-exec2.c
> index 3d3fb430bf..f57903da1e 100644
> --- a/nptl/tst-exec2.c
> +++ b/nptl/tst-exec2.c
> @@ -27,6 +27,7 @@
>  #include <stdlib.h>
>  #include <unistd.h>
>  #include <sys/wait.h>
> +#include <support/xsignal.h>
>  
>  
>  static void *
> @@ -56,11 +57,7 @@ do_test (void)
>      }
>  
>    /* Not interested in knowing when the pipe is closed.  */
> -  if (sigignore (SIGPIPE) != 0)
> -    {
> -      puts ("sigignore failed");
> -      exit (1);
> -    }
> +  xsignal (SIGPIPE, SIG_IGN);
>  
>    pid_t pid = fork ();
>    if (pid == -1)

Ok.

> diff --git a/nptl/tst-exec3.c b/nptl/tst-exec3.c
> index 8a018e916e..b849d3aef7 100644
> --- a/nptl/tst-exec3.c
> +++ b/nptl/tst-exec3.c
> @@ -27,6 +27,7 @@
>  #include <stdlib.h>
>  #include <unistd.h>
>  #include <sys/wait.h>
> +#include <support/xsignal.h>
>  
>  
>  static void *
> @@ -50,11 +51,7 @@ do_test (void)
>      }
>  
>    /* Not interested in knowing when the pipe is closed.  */
> -  if (sigignore (SIGPIPE) != 0)
> -    {
> -      puts ("sigignore failed");
> -      exit (1);
> -    }
> +  xsignal (SIGPIPE, SIG_IGN);
>  
>    pid_t pid = fork ();
>    if (pid == -1)

Ok.

> diff --git a/nptl/tst-exec4.c b/nptl/tst-exec4.c
> index cf5998219b..2f32389f41 100644
> --- a/nptl/tst-exec4.c
> +++ b/nptl/tst-exec4.c
> @@ -22,17 +22,13 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <unistd.h>
> -
> +#include <support/xsignal.h>
>  
>  static void *
>  tf (void *arg)
>  {
>    /* Ignore SIGUSR1 and block SIGUSR2.  */
> -  if (sigignore (SIGUSR1) != 0)
> -    {
> -      puts ("sigignore failed");
> -      exit (1);
> -    }
> +  xsignal (SIGUSR1, SIG_IGN);
>  
>    sigset_t ss;
>    sigemptyset (&ss);

Ok.

> diff --git a/nptl/tst-exec5.c b/nptl/tst-exec5.c
> index 02628931c8..c77f856263 100644
> --- a/nptl/tst-exec5.c
> +++ b/nptl/tst-exec5.c
> @@ -86,11 +86,7 @@ do_test (void)
>      }
>  
>    /* Not interested in knowing when the pipe is closed.  */
> -  if (sigignore (SIGPIPE) != 0)
> -    {
> -      puts ("error: sigignore failed");
> -      exit (1);
> -    }
> +  xsignal (SIGPIPE, SIG_IGN);
>  
>    /* To synchronize with the thread.  */
>    if (pthread_barrier_init (&b, NULL, 2) != 0)

Ok.

> diff --git a/signal/signal.h b/signal/signal.h
> index 40825e95ec..2c57f90e20 100644
> --- a/signal/signal.h
> +++ b/signal/signal.h
> @@ -148,7 +148,8 @@ extern void psiginfo (const siginfo_t *__pinfo, const char *__s);
>  
>  #ifdef __USE_XOPEN_EXTENDED
>  # ifdef __GNUC__
> -extern int sigpause (int __sig) __asm__ ("__xpg_sigpause");
> +extern int sigpause (int __sig) __asm__ ("__xpg_sigpause")
> +  __attribute_deprecated_msg__ ("Use the sigsuspend function instead");
>  # else
>  extern int __sigpause (int __sig_or_mask, int __is_sig);
>  /* Remove a signal from the signal mask and suspend the process.  */

Ok.

> @@ -164,7 +165,9 @@ extern int __sigpause (int __sig_or_mask, int __is_sig);
>     simply do not work in many situations.  Use `sigprocmask' instead.  */
>  
>  /* Compute mask for signal SIG.  */
> -# define sigmask(sig) ((int)(1u << ((sig) - 1)))
> +# define sigmask(sig) \
> +  __glibc_macro_warning ("sigmask is deprecated") \
> +  ((int)(1u << ((sig) - 1)))
>  
>  /* Block signals in MASK, returning the old mask.  */

Ok.

>  extern int sigblock (int __mask) __THROW __attribute_deprecated__;
> @@ -311,7 +314,8 @@ extern int sigreturn (struct sigcontext *__scp) __THROW;
>  /* If INTERRUPT is nonzero, make signal SIG interrupt system calls
>     (causing them to fail with EINTR); if INTERRUPT is zero, make system
>     calls be restarted after signal SIG.  */
> -extern int siginterrupt (int __sig, int __interrupt) __THROW;
> +extern int siginterrupt (int __sig, int __interrupt) __THROW
> +  __attribute_deprecated_msg__ ("Use sigaction with SA_RESTART instead");
>  
>  # include <bits/sigstack.h>
>  # include <bits/ss_flags.h>

Ok.

> @@ -340,16 +344,21 @@ extern int sigstack (struct sigstack *__ss, struct sigstack *__oss)
>  /* Simplified interface for signal management.  */
>  
>  /* Add SIG to the calling process' signal mask.  */
> -extern int sighold (int __sig) __THROW;
> +extern int sighold (int __sig) __THROW
> +  __attribute_deprecated_msg__ ("Use the sigprocmask function instead");
>  
>  /* Remove SIG from the calling process' signal mask.  */
> -extern int sigrelse (int __sig) __THROW;
> +extern int sigrelse (int __sig) __THROW
> +  __attribute_deprecated_msg__ ("Use the sigprocmask function instead");
>  
>  /* Set the disposition of SIG to SIG_IGN.  */
> -extern int sigignore (int __sig) __THROW;
> +extern int sigignore (int __sig) __THROW
> +  __attribute_deprecated_msg__ ("Use the signal function instead");
>  
>  /* Set the disposition of SIG.  */
> -extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW;
> +extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW
> +  __attribute_deprecated_msg__
> +    ("Use the signal and sigprocmask functions instead");
>  #endif
>  
>  #if defined __USE_POSIX199506 || defined __USE_UNIX98

Ok.

> diff --git a/signal/tst-sigset2.c b/signal/tst-sigset2.c
> index f653323321..4eef653f95 100644
> --- a/signal/tst-sigset2.c
> +++ b/signal/tst-sigset2.c
> @@ -9,6 +9,10 @@
>  #include <unistd.h>
>  #include <sys/types.h>
>  #include <sys/wait.h>
> +#include <libc-diag.h>
> +
> +/* The sigset function is deprecated.  */
> +DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
>  
>  #define TEST_SIG SIGINT
>  

Ok.

> diff --git a/signal/tst-sigsimple.c b/signal/tst-sigsimple.c
> index d0e6b2f340..56202348bc 100644
> --- a/signal/tst-sigsimple.c
> +++ b/signal/tst-sigsimple.c
> @@ -20,7 +20,10 @@
>  #include <signal.h>
>  #include <stdio.h>
>  #include <string.h>
> +#include <libc-diag.h>
>  
> +/* The sighold and sigrelse functions are deprecated.  */
> +DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
>  
>  static int
>  do_test (void)
> 

Ok.
  

Patch

diff --git a/NEWS b/NEWS
index 141078c319..fb46af2dd3 100644
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,11 @@  Deprecated and removed features, and other changes affecting compatibility:
   Its implementation always returned with a failure, and the function
   was not declared in any header file.
 
+* The legacy signal handling functions siginterrupt, sigpause, sighold,
+  sigrelse, sigignore and sigset, and the sigmask macro have been
+  deprecated.  Applications should use the sigsuspend, sigprocmask and
+  sigaction functions instead.
+
 Changes to build and runtime requirements:
 
 * powerpc64le requires GCC 7.4 or newer.  This is required for supporting
diff --git a/manual/signal.texi b/manual/signal.texi
index 33e6646975..911b422a18 100644
--- a/manual/signal.texi
+++ b/manual/signal.texi
@@ -3250,6 +3250,9 @@  are interrupted by handling signal @var{signum}.  If @var{failflag} is
 false, signal @var{signum} restarts primitives.  If @var{failflag} is
 true, handling @var{signum} causes these primitives to fail with error
 code @code{EINTR}.  @xref{Interrupted Primitives}.
+
+This function has been replaced by the @code{SA_RESTART} flag of the
+@code{sigaction} function.  @xref{Advanced Signal Handling}.
 @end deftypefun
 
 @deftypefn Macro int sigmask (int @var{signum})
@@ -3267,6 +3270,9 @@  together to specify more than one signal.  For example,
 
 @noindent
 specifies a mask that includes all the job-control stop signals.
+
+This macro has been replaced by the @code{sigset_t} type and the
+associated signal set manipulation functions.  @xref{Signal Sets}.
 @end deftypefn
 
 @deftypefun int sigblock (int @var{mask})
diff --git a/nptl/Makefile b/nptl/Makefile
index ef9a6eb561..105ae50301 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -501,6 +501,13 @@  endif
 # function frequently to get a thread-specific handle.
 CFLAGS-pthread_self.os += -fomit-frame-pointer
 
+# The sigmask macro is deprecated and triggers are compiler warning
+# which cannot be suppressed (as of GCC 9).
+CFLAGS-tst-cancel4.c += -Wno-error
+CFLAGS-tst-cancel5.c += -Wno-error
+CFLAGS-tst-cancelx4.c += -Wno-error
+CFLAGS-tst-cancelx5.c += -Wno-error
+
 # Run the cancellation and cleanup tests also for the modern, exception-based
 # implementation.  For this we have to pass the -fexceptions parameter.
 CFLAGS-tst-cancelx2.c += -fexceptions
diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c
index 652668537a..be7a48e253 100644
--- a/nptl/tst-cancel4.c
+++ b/nptl/tst-cancel4.c
@@ -39,6 +39,7 @@ 
 #include <sys/wait.h>
 #include <sys/stat.h>
 #include <sys/uio.h>
+#include <libc-diag.h>
 
 
 /* Since STREAMS are not supported in the standard Linux kernel and
@@ -527,7 +528,13 @@  tf_sigpause (void *arg)
 
   pthread_cleanup_push (cl, NULL);
 
+  /* This tests the deprecated sigpause and sigmask functions.  The
+     file is compiled with -Wno-errno so that the sigmask deprecation
+     warning is not fatal.  */
+  DIAG_PUSH_NEEDS_COMMENT;
+  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
   sigpause (sigmask (SIGINT));
+  DIAG_POP_NEEDS_COMMENT;
 
   pthread_cleanup_pop (0);
 
diff --git a/nptl/tst-exec1.c b/nptl/tst-exec1.c
index e1a5baa41f..892107d4c7 100644
--- a/nptl/tst-exec1.c
+++ b/nptl/tst-exec1.c
@@ -27,6 +27,7 @@ 
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/wait.h>
+#include <support/xsignal.h>
 
 
 static void *
@@ -56,11 +57,7 @@  do_test (void)
     }
 
   /* Not interested in knowing when the pipe is closed.  */
-  if (sigignore (SIGPIPE) != 0)
-    {
-      puts ("sigignore failed");
-      exit (1);
-    }
+  xsignal (SIGPIPE, SIG_IGN);
 
   posix_spawn_file_actions_t a;
   if (posix_spawn_file_actions_init (&a) != 0)
diff --git a/nptl/tst-exec2.c b/nptl/tst-exec2.c
index 3d3fb430bf..f57903da1e 100644
--- a/nptl/tst-exec2.c
+++ b/nptl/tst-exec2.c
@@ -27,6 +27,7 @@ 
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/wait.h>
+#include <support/xsignal.h>
 
 
 static void *
@@ -56,11 +57,7 @@  do_test (void)
     }
 
   /* Not interested in knowing when the pipe is closed.  */
-  if (sigignore (SIGPIPE) != 0)
-    {
-      puts ("sigignore failed");
-      exit (1);
-    }
+  xsignal (SIGPIPE, SIG_IGN);
 
   pid_t pid = fork ();
   if (pid == -1)
diff --git a/nptl/tst-exec3.c b/nptl/tst-exec3.c
index 8a018e916e..b849d3aef7 100644
--- a/nptl/tst-exec3.c
+++ b/nptl/tst-exec3.c
@@ -27,6 +27,7 @@ 
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/wait.h>
+#include <support/xsignal.h>
 
 
 static void *
@@ -50,11 +51,7 @@  do_test (void)
     }
 
   /* Not interested in knowing when the pipe is closed.  */
-  if (sigignore (SIGPIPE) != 0)
-    {
-      puts ("sigignore failed");
-      exit (1);
-    }
+  xsignal (SIGPIPE, SIG_IGN);
 
   pid_t pid = fork ();
   if (pid == -1)
diff --git a/nptl/tst-exec4.c b/nptl/tst-exec4.c
index cf5998219b..2f32389f41 100644
--- a/nptl/tst-exec4.c
+++ b/nptl/tst-exec4.c
@@ -22,17 +22,13 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-
+#include <support/xsignal.h>
 
 static void *
 tf (void *arg)
 {
   /* Ignore SIGUSR1 and block SIGUSR2.  */
-  if (sigignore (SIGUSR1) != 0)
-    {
-      puts ("sigignore failed");
-      exit (1);
-    }
+  xsignal (SIGUSR1, SIG_IGN);
 
   sigset_t ss;
   sigemptyset (&ss);
diff --git a/nptl/tst-exec5.c b/nptl/tst-exec5.c
index 02628931c8..c77f856263 100644
--- a/nptl/tst-exec5.c
+++ b/nptl/tst-exec5.c
@@ -86,11 +86,7 @@  do_test (void)
     }
 
   /* Not interested in knowing when the pipe is closed.  */
-  if (sigignore (SIGPIPE) != 0)
-    {
-      puts ("error: sigignore failed");
-      exit (1);
-    }
+  xsignal (SIGPIPE, SIG_IGN);
 
   /* To synchronize with the thread.  */
   if (pthread_barrier_init (&b, NULL, 2) != 0)
diff --git a/signal/signal.h b/signal/signal.h
index 40825e95ec..2c57f90e20 100644
--- a/signal/signal.h
+++ b/signal/signal.h
@@ -148,7 +148,8 @@  extern void psiginfo (const siginfo_t *__pinfo, const char *__s);
 
 #ifdef __USE_XOPEN_EXTENDED
 # ifdef __GNUC__
-extern int sigpause (int __sig) __asm__ ("__xpg_sigpause");
+extern int sigpause (int __sig) __asm__ ("__xpg_sigpause")
+  __attribute_deprecated_msg__ ("Use the sigsuspend function instead");
 # else
 extern int __sigpause (int __sig_or_mask, int __is_sig);
 /* Remove a signal from the signal mask and suspend the process.  */
@@ -164,7 +165,9 @@  extern int __sigpause (int __sig_or_mask, int __is_sig);
    simply do not work in many situations.  Use `sigprocmask' instead.  */
 
 /* Compute mask for signal SIG.  */
-# define sigmask(sig) ((int)(1u << ((sig) - 1)))
+# define sigmask(sig) \
+  __glibc_macro_warning ("sigmask is deprecated") \
+  ((int)(1u << ((sig) - 1)))
 
 /* Block signals in MASK, returning the old mask.  */
 extern int sigblock (int __mask) __THROW __attribute_deprecated__;
@@ -311,7 +314,8 @@  extern int sigreturn (struct sigcontext *__scp) __THROW;
 /* If INTERRUPT is nonzero, make signal SIG interrupt system calls
    (causing them to fail with EINTR); if INTERRUPT is zero, make system
    calls be restarted after signal SIG.  */
-extern int siginterrupt (int __sig, int __interrupt) __THROW;
+extern int siginterrupt (int __sig, int __interrupt) __THROW
+  __attribute_deprecated_msg__ ("Use sigaction with SA_RESTART instead");
 
 # include <bits/sigstack.h>
 # include <bits/ss_flags.h>
@@ -340,16 +344,21 @@  extern int sigstack (struct sigstack *__ss, struct sigstack *__oss)
 /* Simplified interface for signal management.  */
 
 /* Add SIG to the calling process' signal mask.  */
-extern int sighold (int __sig) __THROW;
+extern int sighold (int __sig) __THROW
+  __attribute_deprecated_msg__ ("Use the sigprocmask function instead");
 
 /* Remove SIG from the calling process' signal mask.  */
-extern int sigrelse (int __sig) __THROW;
+extern int sigrelse (int __sig) __THROW
+  __attribute_deprecated_msg__ ("Use the sigprocmask function instead");
 
 /* Set the disposition of SIG to SIG_IGN.  */
-extern int sigignore (int __sig) __THROW;
+extern int sigignore (int __sig) __THROW
+  __attribute_deprecated_msg__ ("Use the signal function instead");
 
 /* Set the disposition of SIG.  */
-extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW;
+extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW
+  __attribute_deprecated_msg__
+    ("Use the signal and sigprocmask functions instead");
 #endif
 
 #if defined __USE_POSIX199506 || defined __USE_UNIX98
diff --git a/signal/tst-sigset2.c b/signal/tst-sigset2.c
index f653323321..4eef653f95 100644
--- a/signal/tst-sigset2.c
+++ b/signal/tst-sigset2.c
@@ -9,6 +9,10 @@ 
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <libc-diag.h>
+
+/* The sigset function is deprecated.  */
+DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
 
 #define TEST_SIG SIGINT
 
diff --git a/signal/tst-sigsimple.c b/signal/tst-sigsimple.c
index d0e6b2f340..56202348bc 100644
--- a/signal/tst-sigsimple.c
+++ b/signal/tst-sigsimple.c
@@ -20,7 +20,10 @@ 
 #include <signal.h>
 #include <stdio.h>
 #include <string.h>
+#include <libc-diag.h>
 
+/* The sighold and sigrelse functions are deprecated.  */
+DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
 
 static int
 do_test (void)