On 5/2/22 11:00, Richard Biener wrote:
> On Mon, May 2, 2022 at 10:57 AM Martin Liška <mli...@suse.cz> wrote:
>>
>> On 5/2/22 10:51, Richard Biener wrote:
>>> On Mon, May 2, 2022 at 10:19 AM Martin Liška <mli...@suse.cz> wrote:
>>>>
>>>> On 5/2/22 10:09, Richard Biener wrote:
>>>>> On Mon, May 2, 2022 at 9:52 AM Martin Liška <mli...@suse.cz> wrote:
>>>>>>
>>>>>> Hi.
>>>>>>
>>>>>> This in a new plug-in function that helps identifying compiler
>>>>>> by a linker. Will be used in mold linker.
>>>>>>
>>>>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>>>>>
>>>>>> Ready to be installed?
>>>>>
>>>>> It looks a bit backward to query the compiler (and even more so to
>>>>> have a fixed set) from the linker.  What is this going to be used for?
>>>>
>>>> It's going to be used by mold, there are small behavior divergence
>>>> in between LLVM and GCC, where one compiler closes provided file 
>>>> descriptors:
>>>> https://github.com/rui314/mold/blob/a15f3875269b575d024725590ae3ef87b611b8d8/elf/lto.cc#L545-L550
>>>
>>> But that then seems to be a defect in the plugin API specification (or
>>> one of the two implementations).  Instead of adding a new API entry
>>> that defect should be fixed - both require changes in the actual plugin
>>> specification.
>>
>> Well, the question is if it was specified somewhere or not. Plus there are 
>> released
>> versions of both compilers and plug-ins, so it's not easily fixable :/
> 
> Well, without changing plug-ins the new version callback doesn't exist
> either.  The
> problem of existing discrepancies is not fixable without heuristics in
> the linker,
> the _actual_ problem can of course be fixed but the solution is of course 
> _not_
> to make if (gcc) or if (llvm) but if then something like if (plugin
> closed fd) or

Yes, feature querying would be much better approach.

> specify the plugin has to or has not to close fds passed in
> ld_plugin_input_file.

Anyway, I don't want to over-engineer things here and I think the mold
linker can live with some heuristics.

That said, I don't insist on this patch.

Martin

> 
> Richard.
> 
>> Martin
>>
>>>
>>> Richard.
>>>
>>>>> If then this should probably receive a unformatted string the linker
>>>>> has to decipher itself like "gcc (SUSE Linux) 7.5.0" or something
>>>>> (what we produce with gcc --version), and clang would produce
>>>>> "clang version 11.0.1" or so?
>>>>
>>>> Well, it brings its own set of problems such string parsing. Note that the 
>>>> plugin API
>>>> currently provides something like:
>>>>
>>>> /* The version of gold being used, or -1 if not gold.  The number is
>>>>    MAJOR * 100 + MINOR.  */
>>>> static int gold_version = -1;
>>>>
>>>> So my suggestion is quite aligned with that.
>>>>
>>>> Martin
>>>>
>>>>>
>>>>> Richard.
>>>>>
>>>>>> Thanks,
>>>>>> Martin
>>>>>>
>>>>>> include/ChangeLog:
>>>>>>
>>>>>>         * plugin-api.h (enum ld_plugin_compiler): New enum.
>>>>>>         (enum ld_plugin_version): New typedef.
>>>>>>         (struct ld_plugin_tv): Add new field.
>>>>>>
>>>>>> lto-plugin/ChangeLog:
>>>>>>
>>>>>>         * lto-plugin.c (onload): Call ld_plugin_version.
>>>>>> ---
>>>>>>  include/plugin-api.h    | 18 +++++++++++++++++-
>>>>>>  lto-plugin/lto-plugin.c |  4 ++++
>>>>>>  2 files changed, 21 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/include/plugin-api.h b/include/plugin-api.h
>>>>>> index 4e12c0320d6..4d0989028cc 100644
>>>>>> --- a/include/plugin-api.h
>>>>>> +++ b/include/plugin-api.h
>>>>>> @@ -211,6 +211,13 @@ enum ld_plugin_symbol_section_kind
>>>>>>    LDSSK_BSS
>>>>>>  };
>>>>>>
>>>>>> +enum ld_plugin_compiler
>>>>>> +{
>>>>>> +  LDPC_UNKNOWN,
>>>>>> +  LDPC_GCC,
>>>>>> +  LDPC_LLVM
>>>>>> +};
>>>>>> +
>>>>>>  /* How a symbol is resolved.  */
>>>>>>
>>>>>>  enum ld_plugin_symbol_resolution
>>>>>> @@ -475,6 +482,13 @@ enum ld_plugin_status
>>>>>>  (*ld_plugin_get_wrap_symbols) (uint64_t *num_symbols,
>>>>>>                                 const char ***wrap_symbol_list);
>>>>>>
>>>>>> +/* The linker's interface for registering the "plugin_version" handler.
>>>>>> +   This handler is called directly after onload and provides compiler
>>>>>> +   and its number version (MAJOR * 1000 + MINOR).  */
>>>>>> +
>>>>>> +typedef
>>>>>> +void (*ld_plugin_version) (enum ld_plugin_compiler compiler, int 
>>>>>> version);
>>>>>> +
>>>>>>  enum ld_plugin_level
>>>>>>  {
>>>>>>    LDPL_INFO,
>>>>>> @@ -520,7 +534,8 @@ enum ld_plugin_tag
>>>>>>    LDPT_GET_INPUT_SECTION_SIZE = 30,
>>>>>>    LDPT_REGISTER_NEW_INPUT_HOOK = 31,
>>>>>>    LDPT_GET_WRAP_SYMBOLS = 32,
>>>>>> -  LDPT_ADD_SYMBOLS_V2 = 33
>>>>>> +  LDPT_ADD_SYMBOLS_V2 = 33,
>>>>>> +  LDPT_PLUGIN_VERSION = 34,
>>>>>>  };
>>>>>>
>>>>>>  /* The plugin transfer vector.  */
>>>>>> @@ -556,6 +571,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_version tv_plugin_version;
>>>>>>    } tv_u;
>>>>>>  };
>>>>>>
>>>>>> diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
>>>>>> index 7a1c77812f6..698a0617ca7 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.  
>>>>>> */
>>>>>> @@ -1466,6 +1467,9 @@ onload (struct ld_plugin_tv *tv)
>>>>>>           /* We only use this to make user-friendly temp file names.  */
>>>>>>           link_output_name = p->tv_u.tv_string;
>>>>>>           break;
>>>>>> +       case LDPT_PLUGIN_VERSION:
>>>>>> +         p->tv_u.tv_plugin_version (LDPC_GCC, GCC_VERSION);
>>>>>> +         break;
>>>>>>         default:
>>>>>>           break;
>>>>>>         }
>>>>>> --
>>>>>> 2.36.0
>>>>>>
>>>>
>>

Reply via email to