This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Fix -Os ferror_unlocked linknamespace, localplt issues (bug 15105, bug 19463)
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Mon, 19 Feb 2018 14:30:35 -0300
- Subject: Re: Fix -Os ferror_unlocked linknamespace, localplt issues (bug 15105, bug 19463)
- Authentication-results: sourceware.org; auth=none
- References: <alpine.DEB.2.20.1802141812360.5069@digraph.polyomino.org.uk>
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;
>