V3 [PATCH 1/2] Switch to a new section if the SECTION_RETAIN bit doesn't match

H.J. Lu hjl.tools@gmail.com
Tue Dec 15 02:07:55 GMT 2020


On Mon, Dec 14, 2020 at 5:06 PM Jeff Law <law@redhat.com> wrote:
>
>
>
> On 12/8/20 5:51 AM, H.J. Lu wrote:
> > When definitions marked with used attribute and unmarked definitions are
> > placed in the section with the same name, switch to a new section if the
> > SECTION_RETAIN bit doesn't match.
> >
> > gcc/
> >
> >       PR target/98146
> >       * output.h (switch_to_section): Add a tree argument, default to
> >       nullptr.
> >       * varasm.c (get_section): If the SECTION_RETAIN bit doesn't match,
> >       return and switch to a new section later.
> >       (assemble_start_function): Pass decl to switch_to_section.
> >       (assemble_variable): Likewise.
> >       (switch_to_section): If the SECTION_RETAIN bit doesn't match,
> >       switch to a new section.
> >
> > gcc/testsuite/
> >
> >       PR target/98146
> >       * c-c++-common/attr-used-5.c: New test.
> >       * c-c++-common/attr-used-6.c: Likewise.
> >       * c-c++-common/attr-used-7.c: Likewise.
> >       * c-c++-common/attr-used-8.c: Likewise.
> >       * c-c++-common/attr-used-9.c: Likewise.
> > ---
> >  gcc/output.h                             |  2 +-
> >  gcc/testsuite/c-c++-common/attr-used-5.c | 26 ++++++++++++++++++++
> >  gcc/testsuite/c-c++-common/attr-used-6.c | 26 ++++++++++++++++++++
> >  gcc/testsuite/c-c++-common/attr-used-7.c |  8 +++++++
> >  gcc/testsuite/c-c++-common/attr-used-8.c |  8 +++++++
> >  gcc/testsuite/c-c++-common/attr-used-9.c | 28 ++++++++++++++++++++++
> >  gcc/varasm.c                             | 30 ++++++++++++++++++++----
> >  7 files changed, 123 insertions(+), 5 deletions(-)
> >  create mode 100644 gcc/testsuite/c-c++-common/attr-used-5.c
> >  create mode 100644 gcc/testsuite/c-c++-common/attr-used-6.c
> >  create mode 100644 gcc/testsuite/c-c++-common/attr-used-7.c
> >  create mode 100644 gcc/testsuite/c-c++-common/attr-used-8.c
> >  create mode 100644 gcc/testsuite/c-c++-common/attr-used-9.c
> >
> >
> > diff --git a/gcc/varasm.c b/gcc/varasm.c
> > index 0fac3688828..c5ea29c4e4c 100644
> > --- a/gcc/varasm.c
> > +++ b/gcc/varasm.c
> > @@ -342,6 +342,11 @@ get_section (const char *name, unsigned int flags, tree decl,
> >             sect->common.flags |= (SECTION_WRITE | SECTION_RELRO);
> >             return sect;
> >           }
> > +       /* If the SECTION_RETAIN bit doesn't match, return and switch
> > +          to a new section later.  */
> > +       if ((sect->common.flags & SECTION_RETAIN)
> > +           != (flags & SECTION_RETAIN))
> > +         return sect;
> At the least you need to fix the function comment as it would no longer
> match the behavior in this case.  It also seems to me that having
> SECTION_RETAIN be a special case like this just seems wrong.   In my
> mind there isn't anything fundamentally different with SECTION_RETAIN vs
> other symbols that it deserves to be special cased like this.

Any symbols with SHF_XXX can be special, for example SHF_TLS.

> Clearly we need to fix something as these bits are causing significant
> fallout, but I'm just not sure what the right fix ought to be.
>
> jeff
>


-- 
H.J.


More information about the Gcc-patches mailing list