On Wed, Aug 21, 2024 at 4:25 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> This hook allows the BFD linker plugin to distinguish calls to
> claim_file_handler that know the object is being used by the linker
> (from ldmain.c:add_archive_element), from calls that don't know it's
> being used by the linker (from elf_link_is_defined_archive_symbol); in
> the latter case, the plugin should avoid including the unused LTO archive
> members in link output.  To get the proper support for archives with LTO
> common symbols, the linker fix

OK.

Thanks,
Richard.

> commit a6f8fe0a9e9cbe871652e46ba7c22d5e9fb86208
> Author: H.J. Lu <hjl.to...@gmail.com>
> Date:   Wed Aug 14 20:50:02 2024 -0700
>
>     lto: Don't include unused LTO archive members in output
>
> is required.
>
>         PR lto/116361
>         * lto-plugin.c (claim_file_handler_v2): Rename claimed to
>         can_be_claimed.  Include the LTO object only if it is known to
>         be included in link output.
>
> Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> ---
>  lto-plugin/lto-plugin.c | 53 ++++++++++++++++++++++++-----------------
>  1 file changed, 31 insertions(+), 22 deletions(-)
>
> diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
> index 152648338b9..61b0de62f52 100644
> --- a/lto-plugin/lto-plugin.c
> +++ b/lto-plugin/lto-plugin.c
> @@ -1191,16 +1191,19 @@ process_offload_section (void *data, const char 
> *name, off_t offset, off_t len)
>    return 1;
>  }
>
> -/* Callback used by a linker to check if the plugin will claim FILE. Writes
> -   the result in CLAIMED.  If KNOWN_USED, the object is known by the linker
> -   to be used, or an older API version is in use that does not provide that
> -   information; otherwise, the linker is only determining whether this is
> -   a plugin object and it should not be registered as having offload data if
> -   not claimed by the plugin.  */
> +/* Callback used by a linker to check if the plugin can claim FILE.
> +   Writes the result in CAN_BE_CLAIMED.  If KNOWN_USED != 0, the object
> +   is known by the linker to be included in link output, or an older API
> +   version is in use that does not provide that information.  Otherwise,
> +   the linker is only determining whether this is a plugin object and
> +   only the symbol table is needed by the linker.  In this case, the
> +   object should not be included in link output and this function will
> +   be called by the linker again with KNOWN_USED != 0 after the linker
> +   decides the object should be included in link output. */
>
>  static enum ld_plugin_status
> -claim_file_handler_v2 (const struct ld_plugin_input_file *file, int *claimed,
> -                      int known_used)
> +claim_file_handler_v2 (const struct ld_plugin_input_file *file,
> +                      int *can_be_claimed, int known_used)
>  {
>    enum ld_plugin_status status;
>    struct plugin_objfile obj;
> @@ -1229,7 +1232,7 @@ claim_file_handler_v2 (const struct 
> ld_plugin_input_file *file, int *claimed,
>      }
>    lto_file.handle = file->handle;
>
> -  *claimed = 0;
> +  *can_be_claimed = 0;
>    obj.file = file;
>    obj.found = 0;
>    obj.offload = false;
> @@ -1286,15 +1289,19 @@ claim_file_handler_v2 (const struct 
> ld_plugin_input_file *file, int *claimed,
>                               lto_file.symtab.syms);
>        check (status == LDPS_OK, LDPL_FATAL, "could not add symbols");
>
> -      LOCK_SECTION;
> -      num_claimed_files++;
> -      claimed_files =
> -       xrealloc (claimed_files,
> -                 num_claimed_files * sizeof (struct plugin_file_info));
> -      claimed_files[num_claimed_files - 1] = lto_file;
> -      UNLOCK_SECTION;
> +      /* Include it only if it is known to be used for link output.  */
> +      if (known_used)
> +       {
> +         LOCK_SECTION;
> +         num_claimed_files++;
> +         claimed_files =
> +           xrealloc (claimed_files,
> +                     num_claimed_files * sizeof (struct plugin_file_info));
> +         claimed_files[num_claimed_files - 1] = lto_file;
> +         UNLOCK_SECTION;
> +       }
>
> -      *claimed = 1;
> +      *can_be_claimed = 1;
>      }
>
>    LOCK_SECTION;
> @@ -1310,10 +1317,10 @@ claim_file_handler_v2 (const struct 
> ld_plugin_input_file *file, int *claimed,
>    /* If this is an LTO file without offload, and it is the first LTO file, 
> save
>       the pointer to the last offload file in the list.  Further offload LTO
>       files will be inserted after it, if any.  */
> -  if (*claimed && !obj.offload && offload_files_last_lto == NULL)
> +  if (*can_be_claimed && !obj.offload && offload_files_last_lto == NULL)
>      offload_files_last_lto = offload_files_last;
>
> -  if (obj.offload && (known_used || obj.found > 0))
> +  if (obj.offload && known_used && obj.found > 0)
>      {
>        /* Add file to the list.  The order must be exactly the same as the 
> final
>          order after recompilation and linking, otherwise host and target 
> tables
> @@ -1324,7 +1331,9 @@ claim_file_handler_v2 (const struct 
> ld_plugin_input_file *file, int *claimed,
>        ofld->name = lto_file.name;
>        ofld->next = NULL;
>
> -      if (*claimed && offload_files_last_lto == NULL && file->offset != 0
> +      if (*can_be_claimed
> +         && offload_files_last_lto == NULL
> +         && file->offset != 0
>           && gold_version == -1)
>         {
>           /* ld only: insert first LTO file from the archive after the last 
> real
> @@ -1341,7 +1350,7 @@ claim_file_handler_v2 (const struct 
> ld_plugin_input_file *file, int *claimed,
>               offload_files->next = ofld;
>             }
>         }
> -      else if (*claimed && offload_files_last_lto != NULL)
> +      else if (*can_be_claimed && offload_files_last_lto != NULL)
>         {
>           /* Insert LTO file after the last LTO file in the list.  */
>           ofld->next = offload_files_last_lto->next;
> @@ -1356,7 +1365,7 @@ claim_file_handler_v2 (const struct 
> ld_plugin_input_file *file, int *claimed,
>         offload_files_last = ofld;
>        if (file->offset == 0)
>         offload_files_last_obj = ofld;
> -      if (*claimed)
> +      if (*can_be_claimed)
>         offload_files_last_lto = ofld;
>        num_offload_files++;
>      }
> --
> 2.46.0
>

Reply via email to