public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Rui Ueyama <rui314@gmail.com>
To: Alexander Monakov <amonakov@ispras.ru>
Cc: "Martin Liška" <mliska@suse.cz>,
	"GCC Patches" <gcc-patches@gcc.gnu.org>,
	"Jan Hubicka" <hubicka@ucw.cz>
Subject: Re: [PATCH] lto-plugin: add support for feature detection
Date: Sun, 15 May 2022 16:07:41 +0800	[thread overview]
Message-ID: <CACKH++YwDR-QsD_fv5Ku1w8TTrXK5N14=8LuHh02jYgbokr+Tw@mail.gmail.com> (raw)
In-Reply-To: <9de185b3-914-8522-7eb-40b802d4651@ispras.ru>

On Sun, May 15, 2022 at 3:53 PM Alexander Monakov <amonakov@ispras.ru> wrote:
>
> On Sun, 15 May 2022, Rui Ueyama wrote:
>
> [snip]
> > > So get_symbols_v3 allows the linker to discard an LTO .o file to solve this.
> > >
> > > In absence of get_symbols_v3 mold tries to ensure correctness by restarting
> > > itself while appending a list of .o files to be discarded to its command line.
> > >
> > > I wonder if mold can invoke plugin cleanup callback to solve this without
> > > restarting.
> >
> > We can call the plugin cleanup callback from mold, but there are a few problems:
> >
> > First of all, it looks like it is not clear what state the plugin cleanup
> > callback resets to.  It may reset it to the initial state with which we
> > need to restart everything from calling `onload` callback, or it may not
> > deregister functions registered by the previous `onload` call. Since the
> > exact semantics is not documented, the LLVM gold plugin may behave
> > differently than the GCC plugin.
>
> Ack, that looks risky (and probably unnecessary, see below).
>
> > Second, if we reset a plugin's internal state, we need to register all
> > input files by calling the `claim_file_hook` callback, which in turn calls
> > the `add_symbols` callback. But we don't need any symbol information at
> > this point because mold already knows what are in LTO object files as it
> > calls `claim_file_hook` already on the same sets of files. So the
> > `add_symbols` invocations would be ignored, which is a waste of resources.
> >
> > So, I prefer get_symbols_v3 over calling the plugin cleanup callback.
>
> Oh, to be clear I wouldn't argue against implementing get_symbols_v3 in GCC.
> I was wondering if mold can solve this in another fashion without the
> self-restart trick.
>
> If I understood your design correctly, mold disregards the index in static
> archives, because it doesn't give you the dependency graph of contained
> objects (it only lists defined symbols, not used, I was mistaken about that
> in the previous email), and you wanted to let mold parse all archived
> objects in parallel instead of doing a multiphase scan where each phase
> extracts only the needed objects (in parallel). Is that correct?

Correct.

> Is that a good tradeoff in the LTO case though? I believe you cannot assume
> the plugin to be thread-safe, so you're serializing its API calls, right?
> But the plugin is doing a lot of work, so using the index to feed it with as
> few LTO objects as possible should be a significant win, no? (even if it
> was thread-safe)

Oh, I didn't know that claim_file_hook isn't thread-safe. I need to
add a lock to
guard it then. But is it actually the case?

As to the tradeoff, speculatively loading all object files from
archives may not be
beneficial if the loaded files are LTO object files. But we do this
for consistency.
We don't have a multi-phase name resolution pass at all in mold; all symbols are
resolved at once in parallel. We don't want to implement another name resolution
pass just for LTO for the following reasons:

1. It bloats up the linker's code.

2. We don't know whether an archive file contains an LTO object file
or not until
we actually read archive members, so there's no chance to switch to
the multi-pass
name resolution algorithm before we read files.

3. If we have two different name resolution algorithms, it is very
hard to guarantee
that both algorithms produce the same result. As a result, the output
with -flto may
behave differently without -flto.

4. We still have to handle --start-libs and --end-libs, so feeding an
object file that
will end up not being included into the output is unavoidable.

> And with the index, it should be rare that a file is spuriously added to the
> plugin, so maybe you could get away with issuing a warning or an error when
> the v2 API is used, but mold needs to discard a file?
>
> > > (also, hm, it seems to confirm my idea that LTO .o files should have had the
> > > correct symbol table so normal linker algorithms would work)
> >
> > I agree. If GCC LTO object file contains a correct ELF symbol table, we
> > can also eliminate the need of the special LTO-aware ar command. It looks
> > like it is a very common error to use an ar command that doesn't
> > understand the LTO object file, which results in mysterious "undefined
> > symbol" errors even though the object files in an archive file provide
> > that very symbols.
>
> Thanks.
> Alexander

  reply	other threads:[~2022-05-15  8:07 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-02  7:51 [PATCH] Support LDPT_GET_SYMBOLS_V3 Martin Liška
2022-05-04 12:20 ` [PATCH] lto-plugin: add support for feature detection Martin Liška
2022-05-04 12:32   ` Alexander Monakov
2022-05-04 12:41     ` Martin Liška
2022-05-04 13:10       ` Alexander Monakov
2022-05-04 13:31         ` Martin Liška
2022-05-04 15:06           ` Bernhard Reutner-Fischer
2022-05-05  6:15           ` Richard Biener
2022-05-05  6:31             ` Richard Biener
2022-05-05 10:52               ` Alexander Monakov
2022-05-05 12:50                 ` Martin Liška
2022-05-06 14:46                   ` Alexander Monakov
2022-05-09  9:05                     ` Martin Liška
2022-05-15  6:57                     ` Rui Ueyama
2022-05-15  7:53                       ` Alexander Monakov
2022-05-15  8:07                         ` Rui Ueyama [this message]
2022-05-15  8:50                           ` Alexander Monakov
2022-05-15 10:01                             ` Rui Ueyama
2022-05-15 10:09                               ` Alexander Monakov
2022-05-15 10:32                                 ` Rui Ueyama
2022-05-15 11:37                                   ` Alexander Monakov
2022-05-15 11:52                                     ` Rui Ueyama
2022-05-15 12:07                                       ` Alexander Monakov
2022-05-16  2:41                                         ` Rui Ueyama
2022-05-16  6:38                                           ` Alexander Monakov
2022-05-16  8:37                                             ` Rui Ueyama
2022-05-16  9:10                                               ` Richard Biener
2022-05-16  9:15                                                 ` Alexander Monakov
2022-05-16  9:25                                                 ` Jan Hubicka
2022-05-16  9:38                                                   ` Martin Liška
2022-05-16  9:50                                                     ` Jan Hubicka
2022-05-16 10:22                                                       ` Richard Biener
2022-05-16  9:58                                                     ` Rui Ueyama
2022-05-16 10:28                                                       ` Richard Biener
2022-05-16 10:44                                                         ` Rui Ueyama
2022-05-16 12:04                                                         ` Martin Liška
2022-05-16 13:07                                                           ` Rui Ueyama
2022-05-16 13:38                                                             ` Alexander Monakov
2022-05-16 15:16                                                           ` Alexander Monakov
2022-05-17  6:20                                                             ` Richard Biener
2022-05-17 13:44                                                             ` Martin Liška
2022-06-16  6:59                                                               ` [PATCH 1/3] lto-plugin: support LDPT_GET_SYMBOLS_V3 Martin Liška
2022-06-20  9:23                                                                 ` Richard Biener
2022-06-16  7:01                                                               ` [PATCH 2/3] lto-plugin: make claim_file_handler thread-safe Martin Liška
2022-06-20  9:32                                                                 ` Richard Biener
2022-06-20 10:20                                                                   ` Martin Liška
2022-06-21  7:56                                                                     ` Richard Biener
2022-06-21  8:43                                                                       ` Martin Liška
2022-06-24  8:37                                                                         ` Richard Biener
2022-06-16  7:01                                                               ` [PATCH 3/3] lto-plugin: implement LDPT_GET_API_VERSION Martin Liška
2022-06-16  8:00                                                                 ` Alexander Monakov
2022-06-16 12:25                                                                   ` Martin Liška
2022-06-20  9:35                                                                     ` Richard Biener
2022-06-20 13:01                                                                       ` Martin Liška
2022-06-30  6:43                                                                         ` Rui Ueyama
2022-06-30  8:42                                                                           ` Martin Liška
2022-07-01  6:36                                                                             ` Richard Biener
2022-07-04 14:17                                                                               ` Martin Liška
2022-07-07  2:19                                                                                 ` Rui Ueyama
2022-07-08  8:42                                                                                   ` Martin Liška
2022-07-08 12:41                                                                                     ` Alexander Monakov
2022-07-11  7:23                                                                                       ` Rui Ueyama
2022-07-11  9:16                                                                                         ` Alexander Monakov
2022-07-11  9:55                                                                                           ` Richard Biener
2022-07-11 10:51                                                                                             ` Martin Liška
2022-07-11 12:24                                                                                               ` Rui Ueyama
2022-07-11 12:38                                                                                                 ` Alexander Monakov
2022-07-11 12:51                                                                                                 ` Martin Liška
2022-07-12  1:36                                                                                                   ` Rui Ueyama
2022-07-11 16:35                                                                                               ` Alexander Monakov
2022-07-12  6:28                                                                                                 ` Richard Biener
2022-07-12  7:36                                                                                                   ` Martin Liška
2022-07-12 11:50                                                                                                     ` Rui Ueyama
2022-07-12 13:21                                                                                                       ` Richard Biener
2022-07-12 13:31                                                                                                       ` Martin Liška
2022-07-13  7:44                                                                                                         ` Rui Ueyama

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='CACKH++YwDR-QsD_fv5Ku1w8TTrXK5N14=8LuHh02jYgbokr+Tw@mail.gmail.com' \
    --to=rui314@gmail.com \
    --cc=amonakov@ispras.ru \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hubicka@ucw.cz \
    --cc=mliska@suse.cz \
    /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).