public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: Alexander Monakov <amonakov@ispras.ru>
Cc: "Martin Liška" <mliska@suse.cz>, "Rui Ueyama" <rui314@gmail.com>,
	"Jan Hubicka" <hubicka@kam.mff.cuni.cz>,
	"GCC Patches" <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] lto-plugin: add support for feature detection
Date: Tue, 17 May 2022 08:20:02 +0200	[thread overview]
Message-ID: <CAFiYyc1iTC3W4oNaWrqsj57oEXp7=6DA4Hi31+kE4hN-B9bbDQ@mail.gmail.com> (raw)
In-Reply-To: <73313b19-634b-c4e3-ff6e-e72511258cd3@ispras.ru>

On Mon, May 16, 2022 at 5:16 PM Alexander Monakov <amonakov@ispras.ru> wrote:
>
> On Mon, 16 May 2022, Martin Liška wrote:
>
> > I've implemented first version of the patch, please take a look.
>
> I'll comment on the patch, feel free to inform me when I should back off
> with forcing my opinion in this thread :)

I think your comments are very useful.

> > --- a/include/plugin-api.h
> > +++ b/include/plugin-api.h
> > @@ -483,6 +483,18 @@ enum ld_plugin_level
> >    LDPL_FATAL
> >  };
> >
> > +/* The linker's interface for API version negotiation.  */
> > +
> > +typedef
> > +int (*ld_plugin_get_api_version) (char *linker_identifier, int linker_version,

const char * for the linker_identifier?

> > +                               int preferred_linker_api,
> > +                               const char **compiler_identifier,
> > +                               int *compiler_version);

I think a signed int for the version isn't a good fit so use unsigned?

I miss documentation on who owns linker_identifier and *compiler_identifier.

I also miss documentation on the supported linker_apis and what they mean.
Maybe we want an enum here?

enum linker_api_version
{
   /* The linker/plugin do not implement any of the API levels below, the API
       is determined solely via the transfer vector.  */
   LAPI_UNSPECIFIED = 0,
   /* API level v1.  The linker provides add_symbols_v3, the plugin will use
      that and not any lower versions.  claim_file is thread-safe on the plugin
      side and add_symbols on the linker side.  */
   LAPI_V1 = 1
};

> > +
> > +typedef
> > +enum ld_plugin_status
> > +(*ld_plugin_register_get_api_version) (ld_plugin_get_api_version handler);
> > +
> >  /* Values for the tv_tag field of the transfer vector.  */
> >
> >  enum ld_plugin_tag
> > @@ -521,6 +533,7 @@ enum ld_plugin_tag
> >    LDPT_REGISTER_NEW_INPUT_HOOK,
> >    LDPT_GET_WRAP_SYMBOLS,
> >    LDPT_ADD_SYMBOLS_V2,
> > +  LDPT_REGISTER_GET_API_VERSION,
> >  };
> >
> >  /* The plugin transfer vector.  */
> > @@ -556,6 +569,7 @@ struct ld_plugin_tv
> >      ld_plugin_get_input_section_size tv_get_input_section_size;
> >      ld_plugin_register_new_input tv_register_new_input;
> >      ld_plugin_get_wrap_symbols tv_get_wrap_symbols;
> > +    ld_plugin_register_get_api_version tv_register_get_api_version;
> >    } tv_u;
> >  };
>
> Here I disagree with the overall design. Rui already pointed out how plugin
> API seems to consist of callbacks-that-register-callbacks, and I'm with him
> on that, let's not make that worse. On a more serious note, this pattern:
>
> * the linker provides register_get_api_version entrypoint
> * the plugin registers its get_api_version implementation
> * the linker uses the provided function pointer
>
> is problematic because the plugin doesn't know when the linker is going to
> invoke its callback (or maybe the linker won't do that at all).
>
> I'd recommend to reduce the level of indirection, remove the register_
> callback, and simply require that if LDPT_GET_API_VERSION is provided,
> the plugin MUST invoke it before returning from onload, i.e.:
>
> * the linker invokes onload with LDPT_GET_API_VERSION in 'transfer vector'
> * the plugin iterates over the transfer vector and notes if LDPT_GET_API_VERSION
>   is seen
>   * if not, the plugin knows the linker is predates its introduction
>   * if yes, the plugin invokes it before returning from onload
> * the linker now knows the plugin version (either one provided via
>   LDPT_GET_API_VERSION, or 'old' if the callback wasn't invoked).

That sounds reasonable.  It then basically extends the onload() API without
introducing onload_v2().

> > diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
> > index 00b760636dc..49484decd89 100644
> > --- a/lto-plugin/lto-plugin.c
> > +++ b/lto-plugin/lto-plugin.c
> > @@ -69,6 +69,7 @@ along with this program; see the file COPYING3.  If not see
> >  #include "../gcc/lto/common.h"
> >  #include "simple-object.h"
> >  #include "plugin-api.h"
> > +#include "ansidecl.h"
> >
> >  /* We need to use I64 instead of ll width-specifier on native Windows.
> >     The reason for this is that older MS-runtimes don't support the ll.  */
> > @@ -166,6 +167,10 @@ static ld_plugin_add_input_file add_input_file;
> >  static ld_plugin_add_input_library add_input_library;
> >  static ld_plugin_message message;
> >  static ld_plugin_add_symbols add_symbols, add_symbols_v2;
> > +static ld_plugin_register_get_api_version register_get_api_version;
> > +
> > +/* By default, use version 1 if there is not negotiation.  */
> > +static int used_api_version = 1;
> >
> >  static struct plugin_file_info *claimed_files = NULL;
> >  static unsigned int num_claimed_files = 0;
> > @@ -1407,6 +1412,29 @@ process_option (const char *option)
> >    verbose = verbose || debug;
> >  }
> >
> > +static int
> > +get_api_version (char *linker_identifier, int linker_version,
> > +              int preferred_linker_api,
>
> The 'preferred' qualifier seems vague. If you go with my suggestion above,
> I'd suggest to pass lowest and highest supported version number, and the linker
> can check if that intersects with its range of supported versions, and error out
> if the intersection is empty (and otherwise return the highest version they both
> support as the 'negotiated' one).

That sounds better indeed.  As said above the API level means nothing if
constraints are not thoroughly documented.

> > +              const char **compiler_identifier,
> > +              int *compiler_version)
> > +{
> > +  *compiler_identifier = "GCC";
> > +  *compiler_version = GCC_VERSION;
>
> Note that I'm chiming in here because I worked on a tool that used LTO plugin
> API to discover symbol/section dependencies with high accuracy. So I'd like to
> remind that implementors/consumers of this API are not necessarily compilers!

Indeed.  For example nm/ar when auto-loading the plugin might operate on
LTO IL that is produced by a compiler newer than the sources the linker-plugin
was compiled with.  So maybe it should be 'linker plugin identifier', not
'compiler identifier', likewise for version.  For the GCC source based plugin
it can of course still use GCCs identifier / version.

Richard.

> Alexander

  reply	other threads:[~2022-05-17  6:20 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
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 [this message]
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='CAFiYyc1iTC3W4oNaWrqsj57oEXp7=6DA4Hi31+kE4hN-B9bbDQ@mail.gmail.com' \
    --to=richard.guenther@gmail.com \
    --cc=amonakov@ispras.ru \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hubicka@kam.mff.cuni.cz \
    --cc=mliska@suse.cz \
    --cc=rui314@gmail.com \
    /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).