public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Fangrui Song <i@maskray.me>
To: Alan Modra <amodra@gmail.com>
Cc: binutils@sourceware.org
Subject: Re: [PowerPC] Garbage collecting .toc entries in a non-adhoc way (section group)
Date: Tue, 03 Mar 2020 02:03:00 -0000	[thread overview]
Message-ID: <BY5PR07MB73163B2589E96E97B635FC35CBE40@BY5PR07MB7316.namprd07.prod.outlook.com> (raw)
In-Reply-To: <20200302225028.GL5384@bubble.grove.modra.org>

On Mon, Mar 2, 2020 at 2:50 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Mon, Mar 02, 2020 at 10:02:43AM -0800, Fangrui Song wrote:
> > On Mon, Mar 2, 2020 at 2:59 AM Alan Modra <amodra@gmail.com> wrote:
> > >
> > > On Sun, Mar 01, 2020 at 10:56:02PM -0800, Fangrui Song wrote:
> > > > Now I am thinking about whether we can produce .toc in section groups to obtain garbage collection ability for free.
> > > >
> > > > .text (not in a section group) references `foo` defined in .data.rel.ro.foo (in a section group) via .toc .
> > > > ```
> > > > .text
> > > > addis 3,2,.LC0@toc@ha
> > > >
> > > > .section .data.rel.ro.foo,"aGw",foo,comdat
> > > > .globl foo
> > > > foo:
> > > >
> > > > .section .toc,"aGw",@progbits,foo,comdat
> > > > .LC0:
> > > > .tc foo[TC],foo
> > > > ```
> > > >
> > > > When `.data.rel.ro.foo` and the `.toc` are discarded due to the section
> > > > group rule, the relocation from `.text` to the `.toc` becomes dangling.
> > >
> > > Yes, that breaks the ELF gABI which says: "A symbol table entry with
> > > STB_LOCAL binding that is defined relative to one of a group's
> > > sections, and that is contained in a symbol table section that is not
> > > part of the group, must be discarded if the group members are
> > > discarded.  References to this symbol table entry from outside the
> > > group are not allowed."
> > >
> > > I think what you're trying to do is reinvent the GOT.  There isn't any
> > > reason why powerpc64 can't use a GOT and GOT relocations.
> >
> > Yes, there is inventing the GOT. But neither GCC nor clang produces
> > foo@got@ha and foo@got@l pairs. Is there some hidden wisdom I am
> > missing?
>
> Normally a section group contains related information that a compiler
> generates for something, for example, a function.  Comdat groups are
> used for things like out-of-line definitions of inline functions where
> only one copy of the function should be kept.  You seem to be turning
> this idea on its head, trying to generate groups for references *to* a
> function.  That quite obviously can't work in general, because all the
> groups generated with a particular signature in a program should
> contain the same information: Any one of the groups can be kept by
> the linker.  That means references to external functions can't be
> placed in a group with the same signature as the function.

For this case, foo may be a static function-local object in an inline function.
The symbol foo is defined in .data.rel.ro.foo and all its references
are via .toc
Thus I imagined that in the absence of GOT-generating relocations
(clang/GCC status quo),
placing .toc in the same section group can deduplicate TOC entries.

> So your scheme could only work for functions where you have a local
> definition of the function.  Which is surely not a huge percentage of
> .toc addresses.  And if you're making compiler changes, why not go all
> the way and change gcc or clang to generate @got references?  The
> relocs are available, and BFD ld at least should handle them.

Thanks for the confirmation that switching to @got may be beneficial.
Is there any drawback? I spend very little of time contributing to
LLVM's PowerPC backend.
If you think @got is good, I'd like to investigate more.
I have barely any GCC commit and I will likely not contribute there.

> Incidentally, BFD ld edits the toc to remove unused entries

Thanks for the confirmation. If compilers are generating TOC
relocations, then such ad-hoc garbage collection is unavoidable.

  reply	other threads:[~2020-03-03  2:03 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-02  6:56 Fangrui Song
2020-03-02 10:59 ` Alan Modra
2020-03-02 18:03   ` Fangrui Song
2020-03-02 22:50     ` Alan Modra
2020-03-03  2:03       ` Fangrui Song [this message]
2020-03-04  1:25         ` Alan Modra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BY5PR07MB73163B2589E96E97B635FC35CBE40@BY5PR07MB7316.namprd07.prod.outlook.com \
    --to=i@maskray.me \
    --cc=amodra@gmail.com \
    --cc=binutils@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).