diff mbox series

[6/6] x86: Fix -Os build (BZ #29576)

Message ID 20220921135108.3324737-7-adhemerval.zanella@linaro.org
State New
Headers show
Series Fix -Os build | expand

Commit Message

Adhemerval Zanella Netto Sept. 21, 2022, 1:51 p.m. UTC
The compiler might transform __stpcpy calls (which are routed to
__builtin_stpcpy as an optimization) to strcpy and x86_64 strcpy
multiarch implementation does not build any working symbol due
ISA_SHOULD_BUILD not being evaluated for IS_IN(rtld).

Checked on x86_64-linux-gnu.
---
 sysdeps/x86_64/multiarch/rtld-strcpy.S | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
 create mode 100644 sysdeps/x86_64/multiarch/rtld-strcpy.S

Comments

Carlos O'Donell Oct. 5, 2022, 2:10 p.m. UTC | #1
On Wed, Sep 21, 2022 at 10:51:08AM -0300, Adhemerval Zanella via Libc-alpha wrote:
> The compiler might transform __stpcpy calls (which are routed to
> __builtin_stpcpy as an optimization) to strcpy and x86_64 strcpy
> multiarch implementation does not build any working symbol due
> ISA_SHOULD_BUILD not being evaluated for IS_IN(rtld).

Ohhhhhh... that is interesting. This changes the strcpy used in rtld for
all x86_64 build options, and I'm going to ACK this, but we may need to
revisit this if it shows up in a profile.

CC'ing HJ here in case he wants to comment as a machine maintainer.

LGTM.

No regressions on x86_64.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
 
> Checked on x86_64-linux-gnu.
> ---
>  sysdeps/x86_64/multiarch/rtld-strcpy.S | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
>  create mode 100644 sysdeps/x86_64/multiarch/rtld-strcpy.S
> 
> diff --git a/sysdeps/x86_64/multiarch/rtld-strcpy.S b/sysdeps/x86_64/multiarch/rtld-strcpy.S
> new file mode 100644
> index 0000000000..19439c553d
> --- /dev/null
> +++ b/sysdeps/x86_64/multiarch/rtld-strcpy.S
> @@ -0,0 +1,18 @@
> +/* Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include "../strcpy.S"

OK. Uses Makeconfig:sysd-rules-patterns to capture rtld-*.

> -- 
> 2.34.1
>
H.J. Lu Oct. 5, 2022, 5:21 p.m. UTC | #2
On Wed, Oct 5, 2022 at 7:10 AM Carlos O'Donell <carlos@redhat.com> wrote:
>
> On Wed, Sep 21, 2022 at 10:51:08AM -0300, Adhemerval Zanella via Libc-alpha wrote:
> > The compiler might transform __stpcpy calls (which are routed to
> > __builtin_stpcpy as an optimization) to strcpy and x86_64 strcpy
> > multiarch implementation does not build any working symbol due
> > ISA_SHOULD_BUILD not being evaluated for IS_IN(rtld).
>
> Ohhhhhh... that is interesting. This changes the strcpy used in rtld for
> all x86_64 build options, and I'm going to ACK this, but we may need to
> revisit this if it shows up in a profile.

Will this lead to both strcpy and stpcpy in ld.so? Currently there is only
stpcpy in ld.so.

> CC'ing HJ here in case he wants to comment as a machine maintainer.
>
> LGTM.
>
> No regressions on x86_64.
>
> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
> Tested-by: Carlos O'Donell <carlos@redhat.com>
>
> > Checked on x86_64-linux-gnu.
> > ---
> >  sysdeps/x86_64/multiarch/rtld-strcpy.S | 18 ++++++++++++++++++
> >  1 file changed, 18 insertions(+)
> >  create mode 100644 sysdeps/x86_64/multiarch/rtld-strcpy.S
> >
> > diff --git a/sysdeps/x86_64/multiarch/rtld-strcpy.S b/sysdeps/x86_64/multiarch/rtld-strcpy.S
> > new file mode 100644
> > index 0000000000..19439c553d
> > --- /dev/null
> > +++ b/sysdeps/x86_64/multiarch/rtld-strcpy.S
> > @@ -0,0 +1,18 @@
> > +/* Copyright (C) 2022 Free Software Foundation, Inc.
> > +   This file is part of the GNU C Library.
> > +
> > +   The GNU C Library is free software; you can redistribute it and/or
> > +   modify it under the terms of the GNU Lesser General Public
> > +   License as published by the Free Software Foundation; either
> > +   version 2.1 of the License, or (at your option) any later version.
> > +
> > +   The GNU C Library is distributed in the hope that it will be useful,
> > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > +   Lesser General Public License for more details.
> > +
> > +   You should have received a copy of the GNU Lesser General Public
> > +   License along with the GNU C Library; if not, see
> > +   <https://www.gnu.org/licenses/>.  */
> > +
> > +#include "../strcpy.S"
>
> OK. Uses Makeconfig:sysd-rules-patterns to capture rtld-*.
>
> > --
> > 2.34.1
> >
>
Adhemerval Zanella Netto Oct. 5, 2022, 5:38 p.m. UTC | #3
On 05/10/22 14:21, H.J. Lu wrote:
> On Wed, Oct 5, 2022 at 7:10 AM Carlos O'Donell <carlos@redhat.com> wrote:
>>
>> On Wed, Sep 21, 2022 at 10:51:08AM -0300, Adhemerval Zanella via Libc-alpha wrote:
>>> The compiler might transform __stpcpy calls (which are routed to
>>> __builtin_stpcpy as an optimization) to strcpy and x86_64 strcpy
>>> multiarch implementation does not build any working symbol due
>>> ISA_SHOULD_BUILD not being evaluated for IS_IN(rtld).
>>
>> Ohhhhhh... that is interesting. This changes the strcpy used in rtld for
>> all x86_64 build options, and I'm going to ACK this, but we may need to
>> revisit this if it shows up in a profile.
> 
> Will this lead to both strcpy and stpcpy in ld.so? Currently there is only
> stpcpy in ld.so.

I think that is expected behavior if compiler creates a reference for a
supported string function in the loader (rtld build pulls the
implementation).

> 
>> CC'ing HJ here in case he wants to comment as a machine maintainer.
>>
>> LGTM.
>>
>> No regressions on x86_64.
>>
>> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
>> Tested-by: Carlos O'Donell <carlos@redhat.com>
>>
>>> Checked on x86_64-linux-gnu.
>>> ---
>>>  sysdeps/x86_64/multiarch/rtld-strcpy.S | 18 ++++++++++++++++++
>>>  1 file changed, 18 insertions(+)
>>>  create mode 100644 sysdeps/x86_64/multiarch/rtld-strcpy.S
>>>
>>> diff --git a/sysdeps/x86_64/multiarch/rtld-strcpy.S b/sysdeps/x86_64/multiarch/rtld-strcpy.S
>>> new file mode 100644
>>> index 0000000000..19439c553d
>>> --- /dev/null
>>> +++ b/sysdeps/x86_64/multiarch/rtld-strcpy.S
>>> @@ -0,0 +1,18 @@
>>> +/* Copyright (C) 2022 Free Software Foundation, Inc.
>>> +   This file is part of the GNU C Library.
>>> +
>>> +   The GNU C Library is free software; you can redistribute it and/or
>>> +   modify it under the terms of the GNU Lesser General Public
>>> +   License as published by the Free Software Foundation; either
>>> +   version 2.1 of the License, or (at your option) any later version.
>>> +
>>> +   The GNU C Library is distributed in the hope that it will be useful,
>>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>>> +   Lesser General Public License for more details.
>>> +
>>> +   You should have received a copy of the GNU Lesser General Public
>>> +   License along with the GNU C Library; if not, see
>>> +   <https://www.gnu.org/licenses/>.  */
>>> +
>>> +#include "../strcpy.S"
>>
>> OK. Uses Makeconfig:sysd-rules-patterns to capture rtld-*.
>>
>>> --
>>> 2.34.1
>>>
>>
> 
>
H.J. Lu Oct. 5, 2022, 6:06 p.m. UTC | #4
On Wed, Oct 5, 2022 at 10:38 AM Adhemerval Zanella Netto
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 05/10/22 14:21, H.J. Lu wrote:
> > On Wed, Oct 5, 2022 at 7:10 AM Carlos O'Donell <carlos@redhat.com> wrote:
> >>
> >> On Wed, Sep 21, 2022 at 10:51:08AM -0300, Adhemerval Zanella via Libc-alpha wrote:
> >>> The compiler might transform __stpcpy calls (which are routed to
> >>> __builtin_stpcpy as an optimization) to strcpy and x86_64 strcpy
> >>> multiarch implementation does not build any working symbol due
> >>> ISA_SHOULD_BUILD not being evaluated for IS_IN(rtld).
> >>
> >> Ohhhhhh... that is interesting. This changes the strcpy used in rtld for
> >> all x86_64 build options, and I'm going to ACK this, but we may need to
> >> revisit this if it shows up in a profile.
> >
> > Will this lead to both strcpy and stpcpy in ld.so? Currently there is only
> > stpcpy in ld.so.
>
> I think that is expected behavior if compiler creates a reference for a
> supported string function in the loader (rtld build pulls the
> implementation).

strcpy is only generated in dl-profile.os:

   text    data     bss     dec     hex filename
   2716       0      72    2788     ae4 dl-profile.os (-O2)
   2265       0      72    2337     921 dl-profile.os (-Os)
   1840       0       0    1840     730  strcpy.os

Should we compile dl-profile.c with -O2 with

CFLAGS-dl-profile.c += $(if $(findstring -Os,$(+cflags)), -O2)

It will create a smaller ld.so.

> >
> >> CC'ing HJ here in case he wants to comment as a machine maintainer.
> >>
> >> LGTM.
> >>
> >> No regressions on x86_64.
> >>
> >> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
> >> Tested-by: Carlos O'Donell <carlos@redhat.com>
> >>
> >>> Checked on x86_64-linux-gnu.
> >>> ---
> >>>  sysdeps/x86_64/multiarch/rtld-strcpy.S | 18 ++++++++++++++++++
> >>>  1 file changed, 18 insertions(+)
> >>>  create mode 100644 sysdeps/x86_64/multiarch/rtld-strcpy.S
> >>>
> >>> diff --git a/sysdeps/x86_64/multiarch/rtld-strcpy.S b/sysdeps/x86_64/multiarch/rtld-strcpy.S
> >>> new file mode 100644
> >>> index 0000000000..19439c553d
> >>> --- /dev/null
> >>> +++ b/sysdeps/x86_64/multiarch/rtld-strcpy.S
> >>> @@ -0,0 +1,18 @@
> >>> +/* Copyright (C) 2022 Free Software Foundation, Inc.
> >>> +   This file is part of the GNU C Library.
> >>> +
> >>> +   The GNU C Library is free software; you can redistribute it and/or
> >>> +   modify it under the terms of the GNU Lesser General Public
> >>> +   License as published by the Free Software Foundation; either
> >>> +   version 2.1 of the License, or (at your option) any later version.
> >>> +
> >>> +   The GNU C Library is distributed in the hope that it will be useful,
> >>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> >>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >>> +   Lesser General Public License for more details.
> >>> +
> >>> +   You should have received a copy of the GNU Lesser General Public
> >>> +   License along with the GNU C Library; if not, see
> >>> +   <https://www.gnu.org/licenses/>.  */
> >>> +
> >>> +#include "../strcpy.S"
> >>
> >> OK. Uses Makeconfig:sysd-rules-patterns to capture rtld-*.
> >>
> >>> --
> >>> 2.34.1
> >>>
> >>
> >
> >
Adhemerval Zanella Netto Oct. 5, 2022, 8:43 p.m. UTC | #5
On 05/10/22 15:06, H.J. Lu wrote:
> On Wed, Oct 5, 2022 at 10:38 AM Adhemerval Zanella Netto
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>>
>> On 05/10/22 14:21, H.J. Lu wrote:
>>> On Wed, Oct 5, 2022 at 7:10 AM Carlos O'Donell <carlos@redhat.com> wrote:
>>>>
>>>> On Wed, Sep 21, 2022 at 10:51:08AM -0300, Adhemerval Zanella via Libc-alpha wrote:
>>>>> The compiler might transform __stpcpy calls (which are routed to
>>>>> __builtin_stpcpy as an optimization) to strcpy and x86_64 strcpy
>>>>> multiarch implementation does not build any working symbol due
>>>>> ISA_SHOULD_BUILD not being evaluated for IS_IN(rtld).
>>>>
>>>> Ohhhhhh... that is interesting. This changes the strcpy used in rtld for
>>>> all x86_64 build options, and I'm going to ACK this, but we may need to
>>>> revisit this if it shows up in a profile.
>>>
>>> Will this lead to both strcpy and stpcpy in ld.so? Currently there is only
>>> stpcpy in ld.so.
>>
>> I think that is expected behavior if compiler creates a reference for a
>> supported string function in the loader (rtld build pulls the
>> implementation).
> 
> strcpy is only generated in dl-profile.os:
> 
>    text    data     bss     dec     hex filename
>    2716       0      72    2788     ae4 dl-profile.os (-O2)
>    2265       0      72    2337     921 dl-profile.os (-Os)
>    1840       0       0    1840     730  strcpy.os
> 
> Should we compile dl-profile.c with -O2 with
> 
> CFLAGS-dl-profile.c += $(if $(findstring -Os,$(+cflags)), -O2)
> 
> It will create a smaller ld.so.

It might be an option to a subsequent patch, but I would avoid trying to outsmart
the compiler here since it might generate a smaller in other version and it would
most likely be arch-specific (adding even more building complexity).
H.J. Lu Oct. 5, 2022, 9:27 p.m. UTC | #6
On Wed, Oct 5, 2022 at 1:43 PM Adhemerval Zanella Netto
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 05/10/22 15:06, H.J. Lu wrote:
> > On Wed, Oct 5, 2022 at 10:38 AM Adhemerval Zanella Netto
> > <adhemerval.zanella@linaro.org> wrote:
> >>
> >>
> >>
> >> On 05/10/22 14:21, H.J. Lu wrote:
> >>> On Wed, Oct 5, 2022 at 7:10 AM Carlos O'Donell <carlos@redhat.com> wrote:
> >>>>
> >>>> On Wed, Sep 21, 2022 at 10:51:08AM -0300, Adhemerval Zanella via Libc-alpha wrote:
> >>>>> The compiler might transform __stpcpy calls (which are routed to
> >>>>> __builtin_stpcpy as an optimization) to strcpy and x86_64 strcpy
> >>>>> multiarch implementation does not build any working symbol due
> >>>>> ISA_SHOULD_BUILD not being evaluated for IS_IN(rtld).
> >>>>
> >>>> Ohhhhhh... that is interesting. This changes the strcpy used in rtld for
> >>>> all x86_64 build options, and I'm going to ACK this, but we may need to
> >>>> revisit this if it shows up in a profile.
> >>>
> >>> Will this lead to both strcpy and stpcpy in ld.so? Currently there is only
> >>> stpcpy in ld.so.
> >>
> >> I think that is expected behavior if compiler creates a reference for a
> >> supported string function in the loader (rtld build pulls the
> >> implementation).
> >
> > strcpy is only generated in dl-profile.os:
> >
> >    text    data     bss     dec     hex filename
> >    2716       0      72    2788     ae4 dl-profile.os (-O2)
> >    2265       0      72    2337     921 dl-profile.os (-Os)
> >    1840       0       0    1840     730  strcpy.os
> >
> > Should we compile dl-profile.c with -O2 with
> >
> > CFLAGS-dl-profile.c += $(if $(findstring -Os,$(+cflags)), -O2)
> >
> > It will create a smaller ld.so.
>
> It might be an option to a subsequent patch, but I would avoid trying to outsmart
> the compiler here since it might generate a smaller in other version and it would
> most likely be arch-specific (adding even more building complexity).
>

Fair enough.

LGTM.

Thanks.
diff mbox series

Patch

diff --git a/sysdeps/x86_64/multiarch/rtld-strcpy.S b/sysdeps/x86_64/multiarch/rtld-strcpy.S
new file mode 100644
index 0000000000..19439c553d
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/rtld-strcpy.S
@@ -0,0 +1,18 @@ 
+/* Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include "../strcpy.S"