Fix -Os ferror_unlocked linknamespace, localplt issues (bug 15105, bug 19463)

Message ID alpine.DEB.2.20.1802141812360.5069@digraph.polyomino.org.uk
State New, archived
Headers

Commit Message

Joseph Myers Feb. 14, 2018, 6:13 p.m. UTC
  Continuing the fixes for linknamespace and localplt test failures with
-Os that arise from functions not being inlined in that case, this
patch fixes such failures for ferror_unlocked.  This is relative to a
tree with <https://sourceware.org/ml/libc-alpha/2018-02/msg00264.html>
(pending review) applied, but has only trivial textual dependence on
that patch.

The usual approach is followed of adding __ferror_unlocked (inlined
when ferror_unlocked is), making calls use it when required for
namespace reasons (only one such call), and using libc_hidden_proto /
libc_hidden_weak for the ferror_unlocked weak alias when only localplt
but not namespace issues are involved.

Tested for x86_64 (both without -Os to make sure that case continues
to work, and with -Os to make sure all the relevant linknamespace and
localplt test failures are resolved).  Because of other such failures
that remain after this patch, neither of the bugs can yet be closed.

2018-02-14  Joseph Myers  <joseph@codesourcery.com>

	[BZ #15105]
	[BZ #19463]
	* libio/ferror_u.c (ferror_unlocked): Rename to __ferror_unlocked
	and define as weak alias of __ferror_unlocked.  Use
	libc_hidden_weak.
	* include/stdio.h [!_ISOMAC] (ferror_unlocked): Use
	libc_hidden_proto.
	[!_ISOMAC] (__ferror_unlocked) New declaration, and inline
	function if [__USE_EXTERN_INLINES].
	* time/getdate.c (__getdate_r): Call __ferror_unlocked instead of
	ferror_unlocked.
  

Comments

Joseph Myers Feb. 19, 2018, 4:16 p.m. UTC | #1
Ping.  This patch 
<https://sourceware.org/ml/libc-alpha/2018-02/msg00442.html> is pending 
review.
  
Adhemerval Zanella Netto Feb. 19, 2018, 5:30 p.m. UTC | #2
On 14/02/2018 16:13, Joseph Myers wrote:
> Continuing the fixes for linknamespace and localplt test failures with
> -Os that arise from functions not being inlined in that case, this
> patch fixes such failures for ferror_unlocked.  This is relative to a
> tree with <https://sourceware.org/ml/libc-alpha/2018-02/msg00264.html>
> (pending review) applied, but has only trivial textual dependence on
> that patch.
> 
> The usual approach is followed of adding __ferror_unlocked (inlined
> when ferror_unlocked is), making calls use it when required for
> namespace reasons (only one such call), and using libc_hidden_proto /
> libc_hidden_weak for the ferror_unlocked weak alias when only localplt
> but not namespace issues are involved.
> 
> Tested for x86_64 (both without -Os to make sure that case continues
> to work, and with -Os to make sure all the relevant linknamespace and
> localplt test failures are resolved).  Because of other such failures
> that remain after this patch, neither of the bugs can yet be closed.
> 
> 2018-02-14  Joseph Myers  <joseph@codesourcery.com>
> 
> 	[BZ #15105]
> 	[BZ #19463]
> 	* libio/ferror_u.c (ferror_unlocked): Rename to __ferror_unlocked
> 	and define as weak alias of __ferror_unlocked.  Use
> 	libc_hidden_weak.
> 	* include/stdio.h [!_ISOMAC] (ferror_unlocked): Use
> 	libc_hidden_proto.
> 	[!_ISOMAC] (__ferror_unlocked) New declaration, and inline
> 	function if [__USE_EXTERN_INLINES].
> 	* time/getdate.c (__getdate_r): Call __ferror_unlocked instead of
> 	ferror_unlocked.

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

> 
> diff --git a/include/stdio.h b/include/stdio.h
> index 7ab3ddd..de99120 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -181,6 +181,8 @@ extern __typeof (fputs_unlocked) __fputs_unlocked;
>  libc_hidden_proto (__fputs_unlocked)
>  libc_hidden_proto (feof_unlocked)
>  extern __typeof (feof_unlocked) __feof_unlocked attribute_hidden;
> +libc_hidden_proto (ferror_unlocked)
> +extern __typeof (ferror_unlocked) __ferror_unlocked attribute_hidden;
>  libc_hidden_proto (fmemopen)
>  /* The prototype needs repeating instead of using __typeof to use
>     __THROW in C++ tests.  */
> @@ -207,6 +209,12 @@ __NTH (__feof_unlocked (FILE *__stream))
>  {
>    return __feof_unlocked_body (__stream);
>  }
> +
> +__extern_inline int
> +__NTH (__ferror_unlocked (FILE *__stream))
> +{
> +  return __ferror_unlocked_body (__stream);
> +}
>  #  endif
>  
>  # endif /* not _ISOMAC */
> diff --git a/libio/ferror_u.c b/libio/ferror_u.c
> index afd0bef..3eaf84e 100644
> --- a/libio/ferror_u.c
> +++ b/libio/ferror_u.c
> @@ -30,8 +30,10 @@
>  #undef ferror_unlocked
>  
>  int
> -ferror_unlocked (_IO_FILE *fp)
> +__ferror_unlocked (_IO_FILE *fp)
>  {
>    CHECK_FILE (fp, EOF);
>    return _IO_ferror_unlocked (fp);
>  }
> +weak_alias (__ferror_unlocked, ferror_unlocked)
> +libc_hidden_weak (ferror_unlocked)
> diff --git a/time/getdate.c b/time/getdate.c
> index 29ad760..e568149 100644
> --- a/time/getdate.c
> +++ b/time/getdate.c
> @@ -206,7 +206,7 @@ __getdate_r (const char *string, struct tm *tp)
>    free (line);
>  
>    /* Check for errors. */
> -  if (ferror_unlocked (fp))
> +  if (__ferror_unlocked (fp))
>      {
>        fclose (fp);
>        return 5;
>
  

Patch

diff --git a/include/stdio.h b/include/stdio.h
index 7ab3ddd..de99120 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -181,6 +181,8 @@  extern __typeof (fputs_unlocked) __fputs_unlocked;
 libc_hidden_proto (__fputs_unlocked)
 libc_hidden_proto (feof_unlocked)
 extern __typeof (feof_unlocked) __feof_unlocked attribute_hidden;
+libc_hidden_proto (ferror_unlocked)
+extern __typeof (ferror_unlocked) __ferror_unlocked attribute_hidden;
 libc_hidden_proto (fmemopen)
 /* The prototype needs repeating instead of using __typeof to use
    __THROW in C++ tests.  */
@@ -207,6 +209,12 @@  __NTH (__feof_unlocked (FILE *__stream))
 {
   return __feof_unlocked_body (__stream);
 }
+
+__extern_inline int
+__NTH (__ferror_unlocked (FILE *__stream))
+{
+  return __ferror_unlocked_body (__stream);
+}
 #  endif
 
 # endif /* not _ISOMAC */
diff --git a/libio/ferror_u.c b/libio/ferror_u.c
index afd0bef..3eaf84e 100644
--- a/libio/ferror_u.c
+++ b/libio/ferror_u.c
@@ -30,8 +30,10 @@ 
 #undef ferror_unlocked
 
 int
-ferror_unlocked (_IO_FILE *fp)
+__ferror_unlocked (_IO_FILE *fp)
 {
   CHECK_FILE (fp, EOF);
   return _IO_ferror_unlocked (fp);
 }
+weak_alias (__ferror_unlocked, ferror_unlocked)
+libc_hidden_weak (ferror_unlocked)
diff --git a/time/getdate.c b/time/getdate.c
index 29ad760..e568149 100644
--- a/time/getdate.c
+++ b/time/getdate.c
@@ -206,7 +206,7 @@  __getdate_r (const char *string, struct tm *tp)
   free (line);
 
   /* Check for errors. */
-  if (ferror_unlocked (fp))
+  if (__ferror_unlocked (fp))
     {
       fclose (fp);
       return 5;