unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: Native compiler - passing command line options to C compiler
       [not found] <AM9PR09MB49778CFA83AA6697D09ED01B96CA9@AM9PR09MB4977.eurprd09.prod.outlook.com>
@ 2021-08-30  9:36 ` Andrea Corallo via Emacs development discussions.
  2021-08-30 13:56   ` Arthur Miller
  2021-08-30 11:42 ` Eli Zaretskii
  1 sibling, 1 reply; 24+ messages in thread
From: Andrea Corallo via Emacs development discussions. @ 2021-08-30  9:36 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel

Arthur Miller <arthur.miller@live.com> writes:

> Hi again,
>
> after the few mails the other day, I wasn't really sure if Andrea is going to
> implement it and when.

Sure I was going to implent it as I said so, but thanks for taking the
task :)

> I thought it was rather a tedious manual labour and maybe
> not so important, so I took me a liberty to implement this myself in my own, so
> called, personal copy of Eamcs sources.
>
> I am not sure if I have done it correctly though, I appreciate if Andrea have
> time to take a look;

I just have a small suggestion.

> Mark set
>
> diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
> index 80a1da5ad8..58d361cf46 100644
> --- a/lisp/emacs-lisp/comp.el
> +++ b/lisp/emacs-lisp/comp.el
> @@ -166,6 +166,16 @@ native-comp-async-query-on-exit
>    :type 'boolean
>    :version "28.1")
>  
> +(defcustom native-comp-compiler-options nil
> +  "Options passed verbatim to the native compiler's c driver.

I'd just say "passed to the compiler" or "passed to GCC" as there's no C
involed.

> +#endif
> +  if (CONSP (options))
> +    xsignal1 (Qnative_compiler_error,
> +	      build_string ("Customizing native compiler options"
> +			    " via `comp-native-compiler-options' is"
> +			    " only available on libgccjit version 9"
> +			    " and above."));
> +
> +  /* Captured `comp-native-driver-options' because file-local.  */
                    ^^^
                  native-comp-compiler-options ?
                    

Other that that the patch LGTM.  Could you provide it with its
Changelog?

TIA

  Andrea



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
       [not found] <AM9PR09MB49778CFA83AA6697D09ED01B96CA9@AM9PR09MB4977.eurprd09.prod.outlook.com>
  2021-08-30  9:36 ` Native compiler - passing command line options to C compiler Andrea Corallo via Emacs development discussions.
@ 2021-08-30 11:42 ` Eli Zaretskii
  2021-08-30 12:59   ` Andrea Corallo via Emacs development discussions.
                     ` (2 more replies)
  1 sibling, 3 replies; 24+ messages in thread
From: Eli Zaretskii @ 2021-08-30 11:42 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel

> From: Arthur Miller <arthur.miller@live.com>
> Date: Sun, 29 Aug 2021 23:47:56 +0200
> 
> after the few mails the other day, I wasn't really sure if Andrea is going to
> implement it and when. I thought it was rather a tedious manual labour and maybe
> not so important, so I took me a liberty to implement this myself in my own, so
> called, personal copy of Eamcs sources.

Thanks.

> I am not sure if I have done it correctly though, I appreciate if Andrea have
> time to take a look; I have just mainly copied your code for backend options. It
> seems to work for me, with a minor remark: When I pass a valid option, "native",
> in place where it should go, I get an invalid option error. Gcc even lists it in
> the error message as a valid option. Another option "skylake" works just 
> fine. This seems to vary between flags. I am not sure if this is some encoding
> error from Emacs to libgccjit, or if it is some bug in libgccjit, or is it just
> my brain having dumps.

I guess -march=native is something handled by GCC itself, and here we
don't have it?  If you want to be sure, ask this question on the GCC
list, or report as a bug to their Bugzilla.

> +break your code. Use at own risk.
                  ^^
Two spaces between sentences.

> +DEFUN ("comp-native-compiler-options-effective-p",
> +       Fcomp_native_compiler_options_effective_p,
> +       Scomp_native_compiler_options_effective_p,
> +       0, 0, 0,
> +       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
> +  (void)
> +{
> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)  \
> +  || defined (WINDOWSNT)  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
> +  if (gcc_jit_context_add_command_line_option)
> +    return Qt;
> +#endif

The emphasized part doesn't look right: we did that elsewhere because
the options we pass there work around bugs that happen also in
versions that don't report libgccjit version.  But here this is not
needed, and the version check isn't present anyway.  So the WINDOWSNT
special handling should be removed, I think.

> +static void
> +add_compiler_options (void)
> +{
> +  Lisp_Object options = Fsymbol_value (Qnative_comp_compiler_options);
> +
> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option) \
> +  || defined (WINDOWSNT)
> +  load_gccjit_if_necessary (true);
> +  if (!NILP (Fcomp_native_compiler_options_effective_p ()))

Likewise here.  And since Fcomp_native_compiler_options_effective_p
already does this test, why did you need to have another test outside
it?

> +  /* Captured `comp-native-driver-options' because file-local.  */
> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option) \
> +  || defined (WINDOWSNT)
> +  options = comp.compiler_options;
> +  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
> +    FOR_EACH_TAIL (options)
> +      gcc_jit_context_add_command_line_option (comp.ctxt,
> +                                               /* FIXME: Need to encode
> +                                                  this, but how? either
> +                                                  ENCODE_FILE or
> +                                                  ENCODE_SYSTEM.  */
> +                                               SSDATA (XCAR (options)));
> +#endif

Likewise here.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 11:42 ` Eli Zaretskii
@ 2021-08-30 12:59   ` Andrea Corallo via Emacs development discussions.
  2021-08-30 13:28     ` Eli Zaretskii
  2021-08-30 14:01   ` Arthur Miller
  2021-09-01 14:58   ` Alex Bennée
  2 siblings, 1 reply; 24+ messages in thread
From: Andrea Corallo via Emacs development discussions. @ 2021-08-30 12:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Arthur Miller, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Arthur Miller <arthur.miller@live.com>
>> Date: Sun, 29 Aug 2021 23:47:56 +0200
>> 
>> after the few mails the other day, I wasn't really sure if Andrea is going to
>> implement it and when. I thought it was rather a tedious manual labour and maybe
>> not so important, so I took me a liberty to implement this myself in my own, so
>> called, personal copy of Eamcs sources.
>
> Thanks.
>
>> I am not sure if I have done it correctly though, I appreciate if Andrea have
>> time to take a look; I have just mainly copied your code for backend options. It
>> seems to work for me, with a minor remark: When I pass a valid option, "native",
>> in place where it should go, I get an invalid option error. Gcc even lists it in
>> the error message as a valid option. Another option "skylake" works just 
>> fine. This seems to vary between flags. I am not sure if this is some encoding
>> error from Emacs to libgccjit, or if it is some bug in libgccjit, or is it just
>> my brain having dumps.
>
> I guess -march=native is something handled by GCC itself, and here we
> don't have it?  If you want to be sure, ask this question on the GCC
> list, or report as a bug to their Bugzilla.
>
>> +break your code. Use at own risk.
>                   ^^
> Two spaces between sentences.
>
>> +DEFUN ("comp-native-compiler-options-effective-p",
>> +       Fcomp_native_compiler_options_effective_p,
>> +       Scomp_native_compiler_options_effective_p,
>> +       0, 0, 0,
>> +       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
>> +  (void)
>> +{
>> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)  \
>> +  || defined (WINDOWSNT)  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>> +  if (gcc_jit_context_add_command_line_option)
>> +    return Qt;
>> +#endif
>
> The emphasized part doesn't look right: we did that elsewhere because
> the options we pass there work around bugs that happen also in
> versions that don't report libgccjit version.  But here this is not
> needed, and the version check isn't present anyway.  So the WINDOWSNT
> special handling should be removed, I think.

I think this "defined (WINDOWSNT)" should be there so that compiling on
Windows the check over "gcc_jit_context_add_command_line_option" it is
always compiled even in case the libgccjit.h provided at compile time
does not define
'LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option'.

A newer version of the shared library including the entry point might be
provided later on and will be used at runtime.

This should explain also the other mentioned points.

Regards

  Andrea



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 12:59   ` Andrea Corallo via Emacs development discussions.
@ 2021-08-30 13:28     ` Eli Zaretskii
  2021-08-30 14:28       ` Andrea Corallo via Emacs development discussions.
  0 siblings, 1 reply; 24+ messages in thread
From: Eli Zaretskii @ 2021-08-30 13:28 UTC (permalink / raw)
  To: Andrea Corallo; +Cc: arthur.miller, emacs-devel

> From: Andrea Corallo <akrl@sdf.org>
> Cc: Arthur Miller <arthur.miller@live.com>, emacs-devel@gnu.org
> Date: Mon, 30 Aug 2021 12:59:45 +0000
> 
> I think this "defined (WINDOWSNT)" should be there so that compiling on
> Windows the check over "gcc_jit_context_add_command_line_option" it is
> always compiled even in case the libgccjit.h provided at compile time
> does not define
> 'LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option'.
> 
> A newer version of the shared library including the entry point might be
> provided later on and will be used at runtime.

You cannot use a libgccjit.dll of a version for which Emacs was not
compiled, unless it is binary-compatible.  If Emacs was linked against
libgccjit.dll that didn't support
gcc_jit_context_add_command_line_option, then it would not work to
install a newer version of the DLL that does.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30  9:36 ` Native compiler - passing command line options to C compiler Andrea Corallo via Emacs development discussions.
@ 2021-08-30 13:56   ` Arthur Miller
  2021-08-30 14:05     ` Andrea Corallo via Emacs development discussions.
  0 siblings, 1 reply; 24+ messages in thread
From: Arthur Miller @ 2021-08-30 13:56 UTC (permalink / raw)
  To: Andrea Corallo; +Cc: emacs-devel

Andrea Corallo <akrl@sdf.org> writes:

> Arthur Miller <arthur.miller@live.com> writes:
>
>> Hi again,
>>
>> after the few mails the other day, I wasn't really sure if Andrea is going to
>> implement it and when.
>
> Sure I was going to implent it as I said so, but thanks for taking the
> task :)

I just wanted to test it myself, and it looked like an easy thing to do so it
felt like I can do it, so you have time to do something more important, like
grab a beer, get on a date, or implement some more optimizations? :-)

>> I thought it was rather a tedious manual labour and maybe
>> not so important, so I took me a liberty to implement this myself in my own, so
>> called, personal copy of Eamcs sources.
>>
>> I am not sure if I have done it correctly though, I appreciate if Andrea have
>> time to take a look;
>
> I just have a small suggestion.
>
>> Mark set
>>
>> diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
>> index 80a1da5ad8..58d361cf46 100644
>> --- a/lisp/emacs-lisp/comp.el
>> +++ b/lisp/emacs-lisp/comp.el
>> @@ -166,6 +166,16 @@ native-comp-async-query-on-exit
>>    :type 'boolean
>>    :version "28.1")
>>  
>> +(defcustom native-comp-compiler-options nil
>> +  "Options passed verbatim to the native compiler's c driver.
>
> I'd just say "passed to the compiler" or "passed to GCC" as there's no C
> involed.

Yes, I'll change it. I didn't know really what to say that to be honest.

>> +#endif
>> +  if (CONSP (options))
>> +    xsignal1 (Qnative_compiler_error,
>> +	      build_string ("Customizing native compiler options"
>> +			    " via `comp-native-compiler-options' is"
>> +			    " only available on libgccjit version 9"
>> +			    " and above."));
>> +
>> +  /* Captured `comp-native-driver-options' because file-local.  */
>                     ^^^
>                   native-comp-compiler-options ?
>                     
No idea, but I can change it :-).

> Other that that the patch LGTM.  Could you provide it with its
> Changelog?

Yes, will do later tonight.

Do you want me to also rename the 'native-comp-driver-options' to
'native-comp-backend-options' when I am anyway at it? I can do it in the same
patch if you want.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 11:42 ` Eli Zaretskii
  2021-08-30 12:59   ` Andrea Corallo via Emacs development discussions.
@ 2021-08-30 14:01   ` Arthur Miller
  2021-08-30 14:03     ` Eli Zaretskii
  2021-09-01 14:58   ` Alex Bennée
  2 siblings, 1 reply; 24+ messages in thread
From: Arthur Miller @ 2021-08-30 14:01 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Arthur Miller <arthur.miller@live.com>
>> Date: Sun, 29 Aug 2021 23:47:56 +0200
>> 
>> after the few mails the other day, I wasn't really sure if Andrea is going to
>> implement it and when. I thought it was rather a tedious manual labour and maybe
>> not so important, so I took me a liberty to implement this myself in my own, so
>> called, personal copy of Eamcs sources.
>
> Thanks.
>
>> I am not sure if I have done it correctly though, I appreciate if Andrea have
>> time to take a look; I have just mainly copied your code for backend options. It
>> seems to work for me, with a minor remark: When I pass a valid option, "native",
>> in place where it should go, I get an invalid option error. Gcc even lists it in
>> the error message as a valid option. Another option "skylake" works just 
>> fine. This seems to vary between flags. I am not sure if this is some encoding
>> error from Emacs to libgccjit, or if it is some bug in libgccjit, or is it just
>> my brain having dumps.
>
> I guess -march=native is something handled by GCC itself, and here we
> don't have it?  If you want to be sure, ask this question on the GCC
> list, or report as a bug to their Bugzilla.
>
>> +break your code. Use at own risk.
>                   ^^
> Two spaces between sentences.

Ah, why did I forgott that one :). 

>> +DEFUN ("comp-native-compiler-options-effective-p",
>> +       Fcomp_native_compiler_options_effective_p,
>> +       Scomp_native_compiler_options_effective_p,
>> +       0, 0, 0,
>> +       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
>> +  (void)
>> +{
>> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)  \
>> +  || defined (WINDOWSNT)  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>> +  if (gcc_jit_context_add_command_line_option)
>> +    return Qt;
>> +#endif
>
> The emphasized part doesn't look right: we did that elsewhere because
> the options we pass there work around bugs that happen also in
> versions that don't report libgccjit version.  But here this is not
> needed, and the version check isn't present anyway.  So the WINDOWSNT
> special handling should be removed, I think.

Ok. I am not familiar with the details of how and why, so I just left it. I can
remove it.

>> +static void
>> +add_compiler_options (void)
>> +{
>> +  Lisp_Object options = Fsymbol_value (Qnative_comp_compiler_options);
>> +
>> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option) \
>> +  || defined (WINDOWSNT)
>> +  load_gccjit_if_necessary (true);
>> +  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
>
> Likewise here.  And since Fcomp_native_compiler_options_effective_p
> already does this test, why did you need to have another test outside
> it?

That was just copy pasta. I have noticed that and reflected over that, but I
didn't want to poke too much into stuff. 

>> +  /* Captured `comp-native-driver-options' because file-local.  */
>> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option) \
>> +  || defined (WINDOWSNT)
>> +  options = comp.compiler_options;
>> +  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
>> +    FOR_EACH_TAIL (options)
>> +      gcc_jit_context_add_command_line_option (comp.ctxt,
>> +                                               /* FIXME: Need to encode
>> +                                                  this, but how? either
>> +                                                  ENCODE_FILE or
>> +                                                  ENCODE_SYSTEM.  */
>> +                                               SSDATA (XCAR (options)));
>> +#endif
>
> Likewise here.

Yes, I'll fix Windows case.  If you would like me to test it on Windows it will take
time. Maybe tomorrow or day after. I can send in patch when I tested to save
everyones time.

Thanks for the help and clarifications!



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 14:01   ` Arthur Miller
@ 2021-08-30 14:03     ` Eli Zaretskii
  0 siblings, 0 replies; 24+ messages in thread
From: Eli Zaretskii @ 2021-08-30 14:03 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel

> From: Arthur Miller <arthur.miller@live.com>
> Cc: emacs-devel@gnu.org
> Date: Mon, 30 Aug 2021 16:01:22 +0200
> 
> Yes, I'll fix Windows case.

Thanks.

> If you would like me to test it on Windows it will take time.

No need, I can do that here, but it would help if you show me a
working example (presumably some simple Lisp) to try.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 13:56   ` Arthur Miller
@ 2021-08-30 14:05     ` Andrea Corallo via Emacs development discussions.
  0 siblings, 0 replies; 24+ messages in thread
From: Andrea Corallo via Emacs development discussions. @ 2021-08-30 14:05 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel

Arthur Miller <arthur.miller@live.com> writes:

> Andrea Corallo <akrl@sdf.org> writes:
>
>> Arthur Miller <arthur.miller@live.com> writes:
>>
>>> Hi again,
>>>
>>> after the few mails the other day, I wasn't really sure if Andrea is going to
>>> implement it and when.
>>
>> Sure I was going to implent it as I said so, but thanks for taking the
>> task :)
>
> I just wanted to test it myself, and it looked like an easy thing to do so it
> felt like I can do it, so you have time to do something more important, like
> grab a beer, get on a date, or implement some more optimizations? :-)
>
>>> I thought it was rather a tedious manual labour and maybe
>>> not so important, so I took me a liberty to implement this myself in my own, so
>>> called, personal copy of Eamcs sources.
>>>
>>> I am not sure if I have done it correctly though, I appreciate if Andrea have
>>> time to take a look;
>>
>> I just have a small suggestion.
>>
>>> Mark set
>>>
>>> diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
>>> index 80a1da5ad8..58d361cf46 100644
>>> --- a/lisp/emacs-lisp/comp.el
>>> +++ b/lisp/emacs-lisp/comp.el
>>> @@ -166,6 +166,16 @@ native-comp-async-query-on-exit
>>>    :type 'boolean
>>>    :version "28.1")
>>>  
>>> +(defcustom native-comp-compiler-options nil
>>> +  "Options passed verbatim to the native compiler's c driver.
>>
>> I'd just say "passed to the compiler" or "passed to GCC" as there's no C
>> involed.
>
> Yes, I'll change it. I didn't know really what to say that to be honest.
>
>>> +#endif
>>> +  if (CONSP (options))
>>> +    xsignal1 (Qnative_compiler_error,
>>> +	      build_string ("Customizing native compiler options"
>>> +			    " via `comp-native-compiler-options' is"
>>> +			    " only available on libgccjit version 9"
>>> +			    " and above."));
>>> +
>>> +  /* Captured `comp-native-driver-options' because file-local.  */
>>                     ^^^
>>                   native-comp-compiler-options ?
>>                     
> No idea, but I can change it :-).
>
>> Other that that the patch LGTM.  Could you provide it with its
>> Changelog?
>
> Yes, will do later tonight.
>
> Do you want me to also rename the 'native-comp-driver-options' to
> 'native-comp-backend-options' when I am anyway at it? I can do it in the same
> patch if you want.

Yes please, I guess a second patch would be the best.

Thanks

  Andrea



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 13:28     ` Eli Zaretskii
@ 2021-08-30 14:28       ` Andrea Corallo via Emacs development discussions.
  2021-08-30 15:00         ` Arthur Miller
  2021-08-30 15:50         ` Eli Zaretskii
  0 siblings, 2 replies; 24+ messages in thread
From: Andrea Corallo via Emacs development discussions. @ 2021-08-30 14:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: arthur.miller, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Andrea Corallo <akrl@sdf.org>
>> Cc: Arthur Miller <arthur.miller@live.com>, emacs-devel@gnu.org
>> Date: Mon, 30 Aug 2021 12:59:45 +0000
>> 
>> I think this "defined (WINDOWSNT)" should be there so that compiling on
>> Windows the check over "gcc_jit_context_add_command_line_option" it is
>> always compiled even in case the libgccjit.h provided at compile time
>> does not define
>> 'LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option'.
>> 
>> A newer version of the shared library including the entry point might be
>> provided later on and will be used at runtime.
>
> You cannot use a libgccjit.dll of a version for which Emacs was not
> compiled, unless it is binary-compatible.  If Emacs was linked against
> libgccjit.dll that didn't support
> gcc_jit_context_add_command_line_option, then it would not work to
> install a newer version of the DLL that does.

Okay, I thought on Windows worked differently and we could handle the
case of a symbol not available at compile time but at runtime.  In the
light of this we can probably perform some more clean-up.

Thanks

  Andrea



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 14:28       ` Andrea Corallo via Emacs development discussions.
@ 2021-08-30 15:00         ` Arthur Miller
  2021-08-30 15:38           ` Andrea Corallo via Emacs development discussions.
  2021-08-30 16:01           ` Eli Zaretskii
  2021-08-30 15:50         ` Eli Zaretskii
  1 sibling, 2 replies; 24+ messages in thread
From: Arthur Miller @ 2021-08-30 15:00 UTC (permalink / raw)
  To: Andrea Corallo; +Cc: Eli Zaretskii, emacs-devel

Andrea Corallo <akrl@sdf.org> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> From: Andrea Corallo <akrl@sdf.org>
>>> Cc: Arthur Miller <arthur.miller@live.com>, emacs-devel@gnu.org
>>> Date: Mon, 30 Aug 2021 12:59:45 +0000
>>> 
>>> I think this "defined (WINDOWSNT)" should be there so that compiling on
>>> Windows the check over "gcc_jit_context_add_command_line_option" it is
>>> always compiled even in case the libgccjit.h provided at compile time
>>> does not define
>>> 'LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option'.
>>> 
>>> A newer version of the shared library including the entry point might be
>>> provided later on and will be used at runtime.
>>
>> You cannot use a libgccjit.dll of a version for which Emacs was not
>> compiled, unless it is binary-compatible.  If Emacs was linked against
>> libgccjit.dll that didn't support
>> gcc_jit_context_add_command_line_option, then it would not work to
>> install a newer version of the DLL that does.
>
> Okay, I thought on Windows worked differently and we could handle the
> case of a symbol not available at compile time but at runtime.  In the
> light of this we can probably perform some more clean-up.

So does that mean that windows check is not needed in add_driver_options as well?



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 15:00         ` Arthur Miller
@ 2021-08-30 15:38           ` Andrea Corallo via Emacs development discussions.
  2021-08-31  5:36             ` Arthur Miller
  2021-08-30 16:01           ` Eli Zaretskii
  1 sibling, 1 reply; 24+ messages in thread
From: Andrea Corallo via Emacs development discussions. @ 2021-08-30 15:38 UTC (permalink / raw)
  To: Arthur Miller; +Cc: Eli Zaretskii, emacs-devel

Arthur Miller <arthur.miller@live.com> writes:

> Andrea Corallo <akrl@sdf.org> writes:
>
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>>>> From: Andrea Corallo <akrl@sdf.org>
>>>> Cc: Arthur Miller <arthur.miller@live.com>, emacs-devel@gnu.org
>>>> Date: Mon, 30 Aug 2021 12:59:45 +0000
>>>> 
>>>> I think this "defined (WINDOWSNT)" should be there so that compiling on
>>>> Windows the check over "gcc_jit_context_add_command_line_option" it is
>>>> always compiled even in case the libgccjit.h provided at compile time
>>>> does not define
>>>> 'LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option'.
>>>> 
>>>> A newer version of the shared library including the entry point might be
>>>> provided later on and will be used at runtime.
>>>
>>> You cannot use a libgccjit.dll of a version for which Emacs was not
>>> compiled, unless it is binary-compatible.  If Emacs was linked against
>>> libgccjit.dll that didn't support
>>> gcc_jit_context_add_command_line_option, then it would not work to
>>> install a newer version of the DLL that does.
>>
>> Okay, I thought on Windows worked differently and we could handle the
>> case of a symbol not available at compile time but at runtime.  In the
>> light of this we can probably perform some more clean-up.
>
> So does that mean that windows check is not needed in add_driver_options as well?

AFAIR that was the reason for that check so yes.

  Andrea



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 14:28       ` Andrea Corallo via Emacs development discussions.
  2021-08-30 15:00         ` Arthur Miller
@ 2021-08-30 15:50         ` Eli Zaretskii
  1 sibling, 0 replies; 24+ messages in thread
From: Eli Zaretskii @ 2021-08-30 15:50 UTC (permalink / raw)
  To: Andrea Corallo; +Cc: arthur.miller, emacs-devel

> From: Andrea Corallo <akrl@sdf.org>
> Cc: arthur.miller@live.com, emacs-devel@gnu.org
> Date: Mon, 30 Aug 2021 14:28:18 +0000
> 
> > You cannot use a libgccjit.dll of a version for which Emacs was not
> > compiled, unless it is binary-compatible.  If Emacs was linked against
> > libgccjit.dll that didn't support
> > gcc_jit_context_add_command_line_option, then it would not work to
> > install a newer version of the DLL that does.
> 
> Okay, I thought on Windows worked differently and we could handle the
> case of a symbol not available at compile time but at runtime.

On Windows, we delay loading the libgccjit DLL until it is first
needed, but when it load it, we find the addresses of all the
functions we want to import from the library, and any function that is
not in the library will cause the initialization to fail.  See
init_gccjit_functions, and examine the definition of the LOAD_DLL_FN
macro.  So if someone has a libgccjit DLL without the
gcc_jit_context_add_command_line_option function, they will be unable
to use native-compilation.

Btw, since we already expect gcc_jit_context_add_command_line_option
to exist unconditionally on WINDOWSNT, I guess the test for
LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option is indeed not
needed on WINDOWSNT, because we implicitly assume it will always
succeed.  But I'd like to avoid tricky code if possible.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 15:00         ` Arthur Miller
  2021-08-30 15:38           ` Andrea Corallo via Emacs development discussions.
@ 2021-08-30 16:01           ` Eli Zaretskii
  1 sibling, 0 replies; 24+ messages in thread
From: Eli Zaretskii @ 2021-08-30 16:01 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel, akrl

> From: Arthur Miller <arthur.miller@live.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,  emacs-devel@gnu.org
> Date: Mon, 30 Aug 2021 17:00:08 +0200
> 
> So does that mean that windows check is not needed in add_driver_options as well?

I wouldn't delete it from there.  On Windows, we assume without
checking that gcc_jit_context_add_command_line_option exists, because
(a) Windows versions of libgccjit appeared only in GCC versions that
already supported that, and (b) without that native-compilation could
produce code that crashes on Windows.

IOW, this is an internal implementation detail, a workaround for a
nasty problem.  But for a general-purpose text that will cause no
disaster if it fails, I'd like not to use tricky conditionals that
need long explanations.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 15:38           ` Andrea Corallo via Emacs development discussions.
@ 2021-08-31  5:36             ` Arthur Miller
  2021-08-31  8:06               ` Andrea Corallo via Emacs development discussions.
  2021-08-31 13:01               ` Eli Zaretskii
  0 siblings, 2 replies; 24+ messages in thread
From: Arthur Miller @ 2021-08-31  5:36 UTC (permalink / raw)
  To: Andrea Corallo; +Cc: Eli Zaretskii, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1883 bytes --]

Andrea Corallo <akrl@sdf.org> writes:

> Arthur Miller <arthur.miller@live.com> writes:
>
>> Andrea Corallo <akrl@sdf.org> writes:
>>
>>> Eli Zaretskii <eliz@gnu.org> writes:
>>>
>>>>> From: Andrea Corallo <akrl@sdf.org>
>>>>> Cc: Arthur Miller <arthur.miller@live.com>, emacs-devel@gnu.org
>>>>> Date: Mon, 30 Aug 2021 12:59:45 +0000
>>>>> 
>>>>> I think this "defined (WINDOWSNT)" should be there so that compiling on
>>>>> Windows the check over "gcc_jit_context_add_command_line_option" it is
>>>>> always compiled even in case the libgccjit.h provided at compile time
>>>>> does not define
>>>>> 'LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option'.
>>>>> 
>>>>> A newer version of the shared library including the entry point might be
>>>>> provided later on and will be used at runtime.
>>>>
>>>> You cannot use a libgccjit.dll of a version for which Emacs was not
>>>> compiled, unless it is binary-compatible.  If Emacs was linked against
>>>> libgccjit.dll that didn't support
>>>> gcc_jit_context_add_command_line_option, then it would not work to
>>>> install a newer version of the DLL that does.
>>>
>>> Okay, I thought on Windows worked differently and we could handle the
>>> case of a symbol not available at compile time but at runtime.  In the
>>> light of this we can probably perform some more clean-up.
>>
>> So does that mean that windows check is not needed in add_driver_options as well?
>
> AFAIR that was the reason for that check so yes.
>
>   Andrea

Ok, I have made those changes. I have removed double checks from both
add_driver_options () and  add_compiler_options (). If it is not OK, I can made
another one and revert back this change in add_driver_options.

I have also renamed native-comp-driver-options to native-comp-backend-options.

I forgott to ask, which Changelog are we talking about? Changelo.3 in top Emacs
dir or some other file?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: ncomp-options.patch --]
[-- Type: text/x-patch, Size: 12879 bytes --]

From d0c2b4f882fc67562de6ad67f6dcfdfe6378c32b Mon Sep 17 00:00:00 2001
From: Arthur Miller <arthur.miller@live.com>
Date: Tue, 31 Aug 2021 07:15:01 +0200
Subject: [PATCH] Native comp: gcc cmdopts + rename driver-options to
 backend-options.

---
 lisp/emacs-lisp/bytecomp.el |   4 +-
 lisp/emacs-lisp/comp.el     |  36 ++++++++---
 src/comp.c                  | 122 ++++++++++++++++++++++++++----------
 3 files changed, 118 insertions(+), 44 deletions(-)

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 145cdbaa6e..c2f7b951d9 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -2257,8 +2257,8 @@ byte-compile-from-buffer
           (push `(native-comp-speed . ,native-comp-speed) byte-native-qualities)
           (defvar native-comp-debug)
           (push `(native-comp-debug . ,native-comp-debug) byte-native-qualities)
-          (defvar native-comp-driver-options)
-          (push `(native-comp-driver-options . ,native-comp-driver-options)
+          (defvar native-comp-backend-options)
+          (push `(native-comp-backend-options . ,native-comp-backend-options)
                 byte-native-qualities)
           (defvar no-native-compile)
           (push `(no-native-compile . ,no-native-compile)
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 80a1da5ad8..dab34f89e4 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -166,14 +166,24 @@ native-comp-async-query-on-exit
   :type 'boolean
   :version "28.1")
 
-(defcustom native-comp-driver-options nil
+(defcustom native-comp-compiler-options nil
+  "Command line options passed to the compiler.
+Note that not all options are meaningful and some options might even
+break your Emacs.  Use at own risk.
+
+Passing these options is only available in libgccjit version 9
+and above."
+  :type '(repeat string)
+  :version "28.1")
+
+(defcustom native-comp-backend-options nil
   "Options passed verbatim to the native compiler's back-end driver.
 Note that not all options are meaningful; typically only the options
 affecting the assembler and linker are likely to be useful.
 
 Passing these options is only available in libgccjit version 9
 and above."
-  :type '(repeat string)                ; FIXME is this right?
+  :type '(repeat string)
   :version "28.1")
 
 (defcustom comp-libgccjit-reproducer nil
@@ -755,8 +765,10 @@ comp-data-container
          :documentation "Default speed for this compilation unit.")
   (debug native-comp-debug :type number
          :documentation "Default debug level for this compilation unit.")
-  (driver-options native-comp-driver-options :type list
-         :documentation "Options for the GCC driver.")
+  (compiler-options native-comp-compiler-options :type list
+                    :documentation "Options for the GCC C compiler.")
+  (backend-options native-comp-backend-options :type list
+                   :documentation "Options for the GCC driver.")
   (top-level-forms () :type list
                    :documentation "List of spilled top level forms.")
   (funcs-h (make-hash-table :test #'equal) :type hash-table
@@ -1347,7 +1359,9 @@ comp-spill-lap-function
                                                byte-native-qualities)
         (comp-ctxt-debug comp-ctxt) (alist-get 'native-comp-debug
                                                byte-native-qualities)
-        (comp-ctxt-driver-options comp-ctxt) (alist-get 'native-comp-driver-options
+        (comp-ctxt-compiler-options comp-ctxt) (alist-get 'native-comp-compiler-options
+                                                        byte-native-qualities)
+        (comp-ctxt-backend-options comp-ctxt) (alist-get 'native-comp-backend-options
                                                         byte-native-qualities)
         (comp-ctxt-top-level-forms comp-ctxt)
         (cl-loop
@@ -3663,8 +3677,10 @@ comp-final
                            comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                            comp-ctxt ,comp-ctxt
                            native-comp-eln-load-path ',native-comp-eln-load-path
-                           native-comp-driver-options
-                           ',native-comp-driver-options
+                           native-comp-backend-options
+                           ',native-comp-backend-options
+                           native-comp-compiler-options
+                           ',native-comp-compiler-options
                            load-path ',load-path)
                      ,native-comp-async-env-modifier-form
                      (message "Compiling %s..." ',output)
@@ -3926,8 +3942,10 @@ comp-run-async-workers
                                  comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                                  comp-async-compilation t
                                  native-comp-eln-load-path ',native-comp-eln-load-path
-                                 native-comp-driver-options
-                                 ',native-comp-driver-options
+                                 native-comp-backend-options
+                                 ',native-comp-backend-options
+                                 native-comp-compiler-options
+                                 ',native-comp-compiler-options
                                  load-path ',load-path
                                  warning-fill-column most-positive-fixnum)
                            ,native-comp-async-env-modifier-form
diff --git a/src/comp.c b/src/comp.c
index 3ea2836560..44cc3a7c76 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -509,7 +509,8 @@ #define NUM_CAST_TYPES 15
 typedef struct {
   EMACS_INT speed;
   EMACS_INT debug;
-  Lisp_Object driver_options;
+  Lisp_Object backend_options;
+  Lisp_Object compiler_options;
   gcc_jit_context *ctxt;
   gcc_jit_type *void_type;
   gcc_jit_type *bool_type;
@@ -4361,11 +4362,11 @@ DEFUN ("comp--release-ctxt", Fcomp__release_ctxt, Scomp__release_ctxt,
 }
 
 #pragma GCC diagnostic ignored "-Waddress"
-DEFUN ("comp-native-driver-options-effective-p",
-       Fcomp_native_driver_options_effective_p,
-       Scomp_native_driver_options_effective_p,
+DEFUN ("comp-native-backend-options-effective-p",
+       Fcomp_native_backend_options_effective_p,
+       Scomp_native_backend_options_effective_p,
        0, 0, 0,
-       doc: /* Return t if `comp-native-driver-options' is effective.  */)
+       doc: /* Return t if `comp-native-backend-options' is effective.  */)
   (void)
 {
 #if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)  \
@@ -4377,43 +4378,95 @@ DEFUN ("comp-native-driver-options-effective-p",
 }
 #pragma GCC diagnostic pop
 
+#pragma GCC diagnostic ignored "-Waddress"
+DEFUN ("comp-native-compiler-options-effective-p",
+       Fcomp_native_compiler_options_effective_p,
+       Scomp_native_compiler_options_effective_p,
+       0, 0, 0,
+       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
+  (void)
+{
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  if (gcc_jit_context_add_command_line_option)
+    return Qt;
+#endif
+  return Qnil;
+}
+#pragma GCC diagnostic pop
+
 static void
 add_driver_options (void)
 {
-  Lisp_Object options = Fsymbol_value (Qnative_comp_driver_options);
+  Lisp_Object options = Fsymbol_value (Qnative_comp_backend_options);
 
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
-  || defined (WINDOWSNT)
-  load_gccjit_if_necessary (true);
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
+    {
+      load_gccjit_if_necessary (true);
+      FOR_EACH_TAIL (options)
+        gcc_jit_context_add_driver_option (comp.ctxt,
+                                           /* FIXME: Need to encode
+                                              this, but how? either
+                                              ENCODE_FILE or
+                                              ENCODE_SYSTEM.  */
+                                           SSDATA (XCAR (options)));
+    }
+
+  if (CONSP (options))
+    xsignal1 (Qnative_compiler_error,
+	      build_string ("Customizing native compiler options"
+			    " via `comp-native-backend-options' is"
+			    " only available on libgccjit version 9"
+			    " and above."));
+
+  /* Captured `comp-native-backend-options' because file-local.  */
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
+    {
+      options = comp.backend_options;
+      FOR_EACH_TAIL (options)
+        gcc_jit_context_add_driver_option (comp.ctxt,
+                                           /* FIXME: Need to encode
+                                              this, but how? either
+                                              ENCODE_FILE or
+                                              ENCODE_SYSTEM.  */
+                                           SSDATA (XCAR (options)));
+    }
+}
+
+static void
+add_compiler_options (void)
+{
+  Lisp_Object options = Fsymbol_value (Qnative_comp_compiler_options);
+
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+  {
+    load_gccjit_if_necessary (true);
     FOR_EACH_TAIL (options)
-      gcc_jit_context_add_driver_option (comp.ctxt,
-					 /* FIXME: Need to encode
-					    this, but how? either
-					    ENCODE_FILE or
-					    ENCODE_SYSTEM.  */
-					 SSDATA (XCAR (options)));
-#endif
+        gcc_jit_context_add_command_line_option (comp.ctxt,
+                                                 /* FIXME: Need to encode
+                                                    this, but how? either
+                                                    ENCODE_FILE or
+                                                    ENCODE_SYSTEM.  */
+                                                 SSDATA (XCAR (options)));
+  }
   if (CONSP (options))
     xsignal1 (Qnative_compiler_error,
 	      build_string ("Customizing native compiler options"
-			    " via `comp-native-driver-options' is"
+			    " via `comp-native-compiler-options' is"
 			    " only available on libgccjit version 9"
 			    " and above."));
 
-  /* Captured `comp-native-driver-options' because file-local.  */
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
-  || defined (WINDOWSNT)
-  options = comp.driver_options;
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+  /* Captured `comp-native-compiler-options' because file-local.  */
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+  {
+    options = comp.compiler_options;
     FOR_EACH_TAIL (options)
-      gcc_jit_context_add_driver_option (comp.ctxt,
-					 /* FIXME: Need to encode
-					    this, but how? either
-					    ENCODE_FILE or
-					    ENCODE_SYSTEM.  */
-					 SSDATA (XCAR (options)));
-#endif
+      gcc_jit_context_add_command_line_option (comp.ctxt,
+                                               /* FIXME: Need to encode
+                                                  this, but how? either
+                                                  ENCODE_FILE or
+                                                  ENCODE_SYSTEM.  */
+                                               SSDATA (XCAR (options)));
+  }
 }
 
 DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
@@ -4460,7 +4513,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
   eassert (comp.speed < INT_MAX);
   comp.debug = XFIXNUM (CALL1I (comp-ctxt-debug, Vcomp_ctxt));
   eassert (comp.debug < INT_MAX);
-  comp.driver_options = CALL1I (comp-ctxt-driver-options, Vcomp_ctxt);
+  comp.backend_options = CALL1I (comp-ctxt-backend-options, Vcomp_ctxt);
 
   if (comp.debug)
       gcc_jit_context_set_bool_option (comp.ctxt,
@@ -4536,6 +4589,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
 #endif
 
   add_driver_options ();
+  add_compiler_options ();
 
   if (comp.debug > 1)
       gcc_jit_context_dump_to_file (comp.ctxt,
@@ -5241,7 +5295,8 @@ syms_of_comp (void)
 
   DEFSYM (Qnative_comp_speed, "native-comp-speed");
   DEFSYM (Qnative_comp_debug, "native-comp-debug");
-  DEFSYM (Qnative_comp_driver_options, "native-comp-driver-options");
+  DEFSYM (Qnative_comp_backend_options, "native-comp-backend-options");
+  DEFSYM (Qnative_comp_compiler_options, "native-comp-compiler-options");
   DEFSYM (Qcomp_libgccjit_reproducer, "comp-libgccjit-reproducer");
 
   /* Limple instruction set.  */
@@ -5350,7 +5405,8 @@ syms_of_comp (void)
   defsubr (&Scomp__subr_signature);
   defsubr (&Scomp_el_to_eln_rel_filename);
   defsubr (&Scomp_el_to_eln_filename);
-  defsubr (&Scomp_native_driver_options_effective_p);
+  defsubr (&Scomp_native_backend_options_effective_p);
+  defsubr (&Scomp_native_compiler_options_effective_p);
   defsubr (&Scomp__install_trampoline);
   defsubr (&Scomp__init_ctxt);
   defsubr (&Scomp__release_ctxt);
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-31  5:36             ` Arthur Miller
@ 2021-08-31  8:06               ` Andrea Corallo via Emacs development discussions.
  2021-08-31 13:01               ` Eli Zaretskii
  1 sibling, 0 replies; 24+ messages in thread
From: Andrea Corallo via Emacs development discussions. @ 2021-08-31  8:06 UTC (permalink / raw)
  To: Arthur Miller; +Cc: Eli Zaretskii, emacs-devel

Arthur Miller <arthur.miller@live.com> writes:

[...]

>>
>> AFAIR that was the reason for that check so yes.
>>
>>   Andrea
>
> Ok, I have made those changes. I have removed double checks from both
> add_driver_options () and  add_compiler_options (). If it is not OK, I can made
> another one and revert back this change in add_driver_options.
>
> I have also renamed native-comp-driver-options to native-comp-backend-options.
>
> I forgott to ask, which Changelog are we talking about? Changelo.3 in top Emacs
> dir or some other file?
>
>>From d0c2b4f882fc67562de6ad67f6dcfdfe6378c32b Mon Sep 17 00:00:00 2001
> From: Arthur Miller <arthur.miller@live.com>
> Date: Tue, 31 Aug 2021 07:15:01 +0200
> Subject: [PATCH] Native comp: gcc cmdopts + rename driver-options to
>  backend-options.
>
> ---
>  lisp/emacs-lisp/bytecomp.el |   4 +-
>  lisp/emacs-lisp/comp.el     |  36 ++++++++---
>  src/comp.c                  | 122 ++++++++++++++++++++++++++----------
>  3 files changed, 118 insertions(+), 44 deletions(-)
>
[...]

>  #pragma GCC diagnostic ignored "-Waddress"
> -DEFUN ("comp-native-driver-options-effective-p",
> -       Fcomp_native_driver_options_effective_p,
> -       Scomp_native_driver_options_effective_p,
> +DEFUN ("comp-native-backend-options-effective-p",
> +       Fcomp_native_backend_options_effective_p,
> +       Scomp_native_backend_options_effective_p,
>         0, 0, 0,
> -       doc: /* Return t if `comp-native-driver-options' is effective.  */)
> +       doc: /* Return t if `comp-native-backend-options' is effective.  */)
>    (void)
>  {
>  #if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)  \
> @@ -4377,43 +4378,95 @@ DEFUN ("comp-native-driver-options-effective-p",
>  }
>  #pragma GCC diagnostic pop
>  
> +#pragma GCC diagnostic ignored "-Waddress"
> +DEFUN ("comp-native-compiler-options-effective-p",
> +       Fcomp_native_compiler_options_effective_p,
> +       Scomp_native_compiler_options_effective_p,
> +       0, 0, 0,
> +       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
> +  (void)
> +{
> +#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
> +  if (gcc_jit_context_add_command_line_option)
> +    return Qt;
> +#endif
> +  return Qnil;
> +}
> +#pragma GCC diagnostic pop
> +
>  static void
>  add_driver_options (void)
>  {
> -  Lisp_Object options = Fsymbol_value (Qnative_comp_driver_options);
> +  Lisp_Object options = Fsymbol_value (Qnative_comp_backend_options);
>  
> -#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\

This is still necessary to have the code compatible with old libgccjit.

> -  || defined (WINDOWSNT)
> -  load_gccjit_if_necessary (true);
> -  if (!NILP (Fcomp_native_driver_options_effective_p ()))
> +  if (!NILP (Fcomp_native_backend_options_effective_p ()))
> +    {
> +      load_gccjit_if_necessary (true);
> +      FOR_EACH_TAIL (options)
> +        gcc_jit_context_add_driver_option (comp.ctxt,
> +                                           /* FIXME: Need to encode
> +                                              this, but how? either
> +                                              ENCODE_FILE or
> +                                              ENCODE_SYSTEM.  */
> +                                           SSDATA (XCAR (options)));
> +    }
> +
> +  if (CONSP (options))
> +    xsignal1 (Qnative_compiler_error,
> +	      build_string ("Customizing native compiler options"
> +			    " via `comp-native-backend-options' is"
> +			    " only available on libgccjit version 9"
> +			    " and above."));
> +
> +  /* Captured `comp-native-backend-options' because file-local.  */
> +  if (!NILP (Fcomp_native_backend_options_effective_p ()))
> +    {
> +      options = comp.backend_options;
> +      FOR_EACH_TAIL (options)
> +        gcc_jit_context_add_driver_option (comp.ctxt,
> +                                           /* FIXME: Need to encode
> +                                              this, but how? either
> +                                              ENCODE_FILE or
> +                                              ENCODE_SYSTEM.  */
> +                                           SSDATA (XCAR (options)));
> +    }
> +}
> +
> +static void
> +add_compiler_options (void)
> +{
> +  Lisp_Object options = Fsymbol_value (Qnative_comp_compiler_options);
> +
> +  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
> +  {
> +    load_gccjit_if_necessary (true);
>      FOR_EACH_TAIL (options)
> -      gcc_jit_context_add_driver_option (comp.ctxt,
> -					 /* FIXME: Need to encode
> -					    this, but how? either
> -					    ENCODE_FILE or
> -					    ENCODE_SYSTEM.  */
> -					 SSDATA (XCAR (options)));
> -#endif
> +        gcc_jit_context_add_command_line_option (comp.ctxt,
> +                                                 /* FIXME: Need to encode
> +                                                    this, but how? either
> +                                                    ENCODE_FILE or
> +                                                    ENCODE_SYSTEM.  */
> +                                                 SSDATA (XCAR (options)));
> +  }
>    if (CONSP (options))
>      xsignal1 (Qnative_compiler_error,
>  	      build_string ("Customizing native compiler options"
> -			    " via `comp-native-driver-options' is"
> +			    " via `comp-native-compiler-options' is"
>  			    " only available on libgccjit version 9"
>  			    " and above."));
>  
> -  /* Captured `comp-native-driver-options' because file-local.  */
> -#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\

Same

TIA

  Andrea



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-31  5:36             ` Arthur Miller
  2021-08-31  8:06               ` Andrea Corallo via Emacs development discussions.
@ 2021-08-31 13:01               ` Eli Zaretskii
  2021-08-31 22:53                 ` Arthur Miller
  1 sibling, 1 reply; 24+ messages in thread
From: Eli Zaretskii @ 2021-08-31 13:01 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel, akrl

> From: Arthur Miller <arthur.miller@live.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,  emacs-devel@gnu.org
> Date: Tue, 31 Aug 2021 07:36:47 +0200
> 
> Ok, I have made those changes. I have removed double checks from both
> add_driver_options () and  add_compiler_options (). If it is not OK, I can made
> another one and revert back this change in add_driver_options.

I think you should indeed do the latter.

> I forgott to ask, which Changelog are we talking about? Changelo.3 in top Emacs
> dir or some other file?

No file.  We no longer maintain ChangeLog files by hand, we generate
them from Git log.  So you should include in the patch the log message
formatted according to ChangeLog rules, but not a patch to any
specific ChangeLog file.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-31 13:01               ` Eli Zaretskii
@ 2021-08-31 22:53                 ` Arthur Miller
  2021-09-01 11:45                   ` Eli Zaretskii
  0 siblings, 1 reply; 24+ messages in thread
From: Arthur Miller @ 2021-08-31 22:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, akrl

[-- Attachment #1: Type: text/plain, Size: 1314 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Arthur Miller <arthur.miller@live.com>
>> Cc: Eli Zaretskii <eliz@gnu.org>,  emacs-devel@gnu.org
>> Date: Tue, 31 Aug 2021 07:36:47 +0200
>> 
>> Ok, I have made those changes. I have removed double checks from both
>> add_driver_options () and  add_compiler_options (). If it is not OK, I can made
>> another one and revert back this change in add_driver_options.
>
> I think you should indeed do the latter.
>
>> I forgott to ask, which Changelog are we talking about? Changelo.3 in top Emacs
>> dir or some other file?
>
> No file.  We no longer maintain ChangeLog files by hand, we generate
> them from Git log.  So you should include in the patch the log message
> formatted according to ChangeLog rules, but not a patch to any
> specific ChangeLog file.

Oki, guys here is one: no Windows check, but double checks left. That is what is
asked? Hopefully changelog works, I have tried to conform to instruction in
CONTRIBUTING and I have tried to keep mysef breef.

I forgott to say, I have tested to sett options via Customize and it worked
fine, so I have also removed that 'FIXME' in comp.el next to '(repeat string)
option. Hope it is  OK.

Since this is a user visible change, does it need to be documented in some
manual and NEWS too?

Best regards
/arthur


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: ncomp-options.patch --]
[-- Type: text/x-patch, Size: 12274 bytes --]

From 52cc5d113bcb3b8c1b0654cc855c0857b2c0bb95 Mon Sep 17 00:00:00 2001
From: Arthur Miller <arthur.miller@live.com>
Date: Wed, 1 Sep 2021 00:50:49 +0200
Subject: [PATCH] Native comp add/change GCC command-line options

Added support for GCC command-line options via 'native-comp-compiler-options'.
Renamed 'native-comp-driver-options' to 'native-comp-backend-options'.
---
 lisp/emacs-lisp/bytecomp.el |  4 +-
 lisp/emacs-lisp/comp.el     | 36 +++++++++++----
 src/comp.c                  | 87 ++++++++++++++++++++++++++++++-------
 3 files changed, 100 insertions(+), 27 deletions(-)

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 145cdbaa6e..c2f7b951d9 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -2257,8 +2257,8 @@ byte-compile-from-buffer
           (push `(native-comp-speed . ,native-comp-speed) byte-native-qualities)
           (defvar native-comp-debug)
           (push `(native-comp-debug . ,native-comp-debug) byte-native-qualities)
-          (defvar native-comp-driver-options)
-          (push `(native-comp-driver-options . ,native-comp-driver-options)
+          (defvar native-comp-backend-options)
+          (push `(native-comp-backend-options . ,native-comp-backend-options)
                 byte-native-qualities)
           (defvar no-native-compile)
           (push `(no-native-compile . ,no-native-compile)
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 80a1da5ad8..30febaf7d8 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -166,14 +166,24 @@ native-comp-async-query-on-exit
   :type 'boolean
   :version "28.1")
 
-(defcustom native-comp-driver-options nil
+(defcustom native-comp-compiler-options nil
+  "Command line options passed verbatim to GCC compiler.
+Note that not all options are meaningful and some options might even
+break your Emacs.  Use at own risk.
+
+Passing these options is only available in libgccjit version 9
+and above."
+  :type '(repeat string)
+  :version "28.1")
+
+(defcustom native-comp-backend-options nil
   "Options passed verbatim to the native compiler's back-end driver.
 Note that not all options are meaningful; typically only the options
 affecting the assembler and linker are likely to be useful.
 
 Passing these options is only available in libgccjit version 9
 and above."
-  :type '(repeat string)                ; FIXME is this right?
+  :type '(repeat string)
   :version "28.1")
 
 (defcustom comp-libgccjit-reproducer nil
@@ -755,8 +765,10 @@ comp-data-container
          :documentation "Default speed for this compilation unit.")
   (debug native-comp-debug :type number
          :documentation "Default debug level for this compilation unit.")
-  (driver-options native-comp-driver-options :type list
-         :documentation "Options for the GCC driver.")
+  (compiler-options native-comp-compiler-options :type list
+                    :documentation "Options for the GCC compiler.")
+  (backend-options native-comp-backend-options :type list
+                   :documentation "Options for the GCC driver.")
   (top-level-forms () :type list
                    :documentation "List of spilled top level forms.")
   (funcs-h (make-hash-table :test #'equal) :type hash-table
@@ -1347,7 +1359,9 @@ comp-spill-lap-function
                                                byte-native-qualities)
         (comp-ctxt-debug comp-ctxt) (alist-get 'native-comp-debug
                                                byte-native-qualities)
-        (comp-ctxt-driver-options comp-ctxt) (alist-get 'native-comp-driver-options
+        (comp-ctxt-compiler-options comp-ctxt) (alist-get 'native-comp-compiler-options
+                                                        byte-native-qualities)
+        (comp-ctxt-backend-options comp-ctxt) (alist-get 'native-comp-backend-options
                                                         byte-native-qualities)
         (comp-ctxt-top-level-forms comp-ctxt)
         (cl-loop
@@ -3663,8 +3677,10 @@ comp-final
                            comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                            comp-ctxt ,comp-ctxt
                            native-comp-eln-load-path ',native-comp-eln-load-path
-                           native-comp-driver-options
-                           ',native-comp-driver-options
+                           native-comp-backend-options
+                           ',native-comp-backend-options
+                           native-comp-compiler-options
+                           ',native-comp-compiler-options
                            load-path ',load-path)
                      ,native-comp-async-env-modifier-form
                      (message "Compiling %s..." ',output)
@@ -3926,8 +3942,10 @@ comp-run-async-workers
                                  comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                                  comp-async-compilation t
                                  native-comp-eln-load-path ',native-comp-eln-load-path
-                                 native-comp-driver-options
-                                 ',native-comp-driver-options
+                                 native-comp-backend-options
+                                 ',native-comp-backend-options
+                                 native-comp-compiler-options
+                                 ',native-comp-compiler-options
                                  load-path ',load-path
                                  warning-fill-column most-positive-fixnum)
                            ,native-comp-async-env-modifier-form
diff --git a/src/comp.c b/src/comp.c
index 3ea2836560..7fb74c88d2 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -509,7 +509,8 @@ #define NUM_CAST_TYPES 15
 typedef struct {
   EMACS_INT speed;
   EMACS_INT debug;
-  Lisp_Object driver_options;
+  Lisp_Object backend_options;
+  Lisp_Object compiler_options;
   gcc_jit_context *ctxt;
   gcc_jit_type *void_type;
   gcc_jit_type *bool_type;
@@ -4361,15 +4362,14 @@ DEFUN ("comp--release-ctxt", Fcomp__release_ctxt, Scomp__release_ctxt,
 }
 
 #pragma GCC diagnostic ignored "-Waddress"
-DEFUN ("comp-native-driver-options-effective-p",
-       Fcomp_native_driver_options_effective_p,
-       Scomp_native_driver_options_effective_p,
+DEFUN ("comp-native-backend-options-effective-p",
+       Fcomp_native_backend_options_effective_p,
+       Scomp_native_backend_options_effective_p,
        0, 0, 0,
-       doc: /* Return t if `comp-native-driver-options' is effective.  */)
+       doc: /* Return t if `comp-native-backend-options' is effective.  */)
   (void)
 {
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)  \
-  || defined (WINDOWSNT)
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
   if (gcc_jit_context_add_driver_option)
     return Qt;
 #endif
@@ -4377,15 +4377,30 @@ DEFUN ("comp-native-driver-options-effective-p",
 }
 #pragma GCC diagnostic pop
 
+#pragma GCC diagnostic ignored "-Waddress"
+DEFUN ("comp-native-compiler-options-effective-p",
+       Fcomp_native_compiler_options_effective_p,
+       Scomp_native_compiler_options_effective_p,
+       0, 0, 0,
+       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
+  (void)
+{
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  if (gcc_jit_context_add_command_line_option)
+    return Qt;
+#endif
+  return Qnil;
+}
+#pragma GCC diagnostic pop
+
 static void
 add_driver_options (void)
 {
   Lisp_Object options = Fsymbol_value (Qnative_comp_driver_options);
 
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
-  || defined (WINDOWSNT)
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
   load_gccjit_if_necessary (true);
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
     FOR_EACH_TAIL (options)
       gcc_jit_context_add_driver_option (comp.ctxt,
 					 /* FIXME: Need to encode
@@ -4397,15 +4412,15 @@ add_driver_options (void)
   if (CONSP (options))
     xsignal1 (Qnative_compiler_error,
 	      build_string ("Customizing native compiler options"
-			    " via `comp-native-driver-options' is"
+			    " via `comp-native-backend-options' is"
 			    " only available on libgccjit version 9"
 			    " and above."));
 
   /* Captured `comp-native-driver-options' because file-local.  */
 #if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
   || defined (WINDOWSNT)
-  options = comp.driver_options;
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+  options = comp.backend_options;
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
     FOR_EACH_TAIL (options)
       gcc_jit_context_add_driver_option (comp.ctxt,
 					 /* FIXME: Need to encode
@@ -4416,6 +4431,43 @@ add_driver_options (void)
 #endif
 }
 
+static void
+add_compiler_options (void)
+{
+  Lisp_Object options = Fsymbol_value (Qnative_comp_compiler_options);
+
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  load_gccjit_if_necessary (true);
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+    FOR_EACH_TAIL (options)
+        gcc_jit_context_add_command_line_option (comp.ctxt,
+                                                 /* FIXME: Need to encode
+                                                    this, but how? either
+                                                    ENCODE_FILE or
+                                                    ENCODE_SYSTEM.  */
+                                                 SSDATA (XCAR (options)));
+#endif
+  if (CONSP (options))
+    xsignal1 (Qnative_compiler_error,
+	      build_string ("Customizing native compiler options"
+			    " via `comp-native-compiler-options' is"
+			    " only available on libgccjit version 9"
+			    " and above."));
+
+  /* Captured `comp-native-compiler-options' because file-local.  */
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  options = comp.compiler_options;
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+    FOR_EACH_TAIL (options)
+      gcc_jit_context_add_command_line_option (comp.ctxt,
+                                               /* FIXME: Need to encode
+                                                  this, but how? either
+                                                  ENCODE_FILE or
+                                                  ENCODE_SYSTEM.  */
+                                               SSDATA (XCAR (options)));
+#endif
+}
+
 DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
        Scomp__compile_ctxt_to_file,
        1, 1, 0,
@@ -4460,7 +4512,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
   eassert (comp.speed < INT_MAX);
   comp.debug = XFIXNUM (CALL1I (comp-ctxt-debug, Vcomp_ctxt));
   eassert (comp.debug < INT_MAX);
-  comp.driver_options = CALL1I (comp-ctxt-driver-options, Vcomp_ctxt);
+  comp.backend_options = CALL1I (comp-ctxt-backend-options, Vcomp_ctxt);
 
   if (comp.debug)
       gcc_jit_context_set_bool_option (comp.ctxt,
@@ -4536,6 +4588,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
 #endif
 
   add_driver_options ();
+  add_compiler_options ();
 
   if (comp.debug > 1)
       gcc_jit_context_dump_to_file (comp.ctxt,
@@ -5241,7 +5294,8 @@ syms_of_comp (void)
 
   DEFSYM (Qnative_comp_speed, "native-comp-speed");
   DEFSYM (Qnative_comp_debug, "native-comp-debug");
-  DEFSYM (Qnative_comp_driver_options, "native-comp-driver-options");
+  DEFSYM (Qnative_comp_backend_options, "native-comp-backend-options");
+  DEFSYM (Qnative_comp_compiler_options, "native-comp-compiler-options");
   DEFSYM (Qcomp_libgccjit_reproducer, "comp-libgccjit-reproducer");
 
   /* Limple instruction set.  */
@@ -5350,7 +5404,8 @@ syms_of_comp (void)
   defsubr (&Scomp__subr_signature);
   defsubr (&Scomp_el_to_eln_rel_filename);
   defsubr (&Scomp_el_to_eln_filename);
-  defsubr (&Scomp_native_driver_options_effective_p);
+  defsubr (&Scomp_native_backend_options_effective_p);
+  defsubr (&Scomp_native_compiler_options_effective_p);
   defsubr (&Scomp__install_trampoline);
   defsubr (&Scomp__init_ctxt);
   defsubr (&Scomp__release_ctxt);
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-31 22:53                 ` Arthur Miller
@ 2021-09-01 11:45                   ` Eli Zaretskii
  2021-09-01 14:23                     ` Arthur Miller
  0 siblings, 1 reply; 24+ messages in thread
From: Eli Zaretskii @ 2021-09-01 11:45 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel, akrl

> From: Arthur Miller <arthur.miller@live.com>
> Cc: akrl@sdf.org,  emacs-devel@gnu.org
> Date: Wed, 01 Sep 2021 00:53:31 +0200
> 
> > No file.  We no longer maintain ChangeLog files by hand, we generate
> > them from Git log.  So you should include in the patch the log message
> > formatted according to ChangeLog rules, but not a patch to any
> > specific ChangeLog file.
> 
> Oki, guys here is one: no Windows check, but double checks left. That is what is
> asked? Hopefully changelog works, I have tried to conform to instruction in
> CONTRIBUTING and I have tried to keep mysef breef.

Almost there: the commit log message should mention the files and
functions where you made the changes.  Look at the other log messages
in git, and you will see the difference (feel free to ask if still
unclear).

Thanks for working on this.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-09-01 11:45                   ` Eli Zaretskii
@ 2021-09-01 14:23                     ` Arthur Miller
  2021-09-01 16:45                       ` Eli Zaretskii
  0 siblings, 1 reply; 24+ messages in thread
From: Arthur Miller @ 2021-09-01 14:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, akrl

[-- Attachment #1: Type: text/plain, Size: 1135 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Arthur Miller <arthur.miller@live.com>
>> Cc: akrl@sdf.org,  emacs-devel@gnu.org
>> Date: Wed, 01 Sep 2021 00:53:31 +0200
>> 
>> > No file.  We no longer maintain ChangeLog files by hand, we generate
>> > them from Git log.  So you should include in the patch the log message
>> > formatted according to ChangeLog rules, but not a patch to any
>> > specific ChangeLog file.
>> 
>> Oki, guys here is one: no Windows check, but double checks left. That is what is
>> asked? Hopefully changelog works, I have tried to conform to instruction in
>> CONTRIBUTING and I have tried to keep mysef breef.
>
> Almost there: the commit log message should mention the files and
> functions where you made the changes.  Look at the other log messages
> in git, and you will see the difference (feel free to ask if still
> unclear).
>
> Thanks for working on this.

See if this is ok. I don't know how to get in ` into git message. My bash is
complaining, but I see in some git log that Lars had quoted some names with `'.

Found also one check for WINDOWS I forgott to remove.

See if this one is ok:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: ncomp-options.patch --]
[-- Type: text/x-patch, Size: 12749 bytes --]

From f4e7c83ce034e3ea5ae1c0fdd4d3c7872c978dcd Mon Sep 17 00:00:00 2001
From: Arthur Miller <arthur.miller@live.com>
Date: Wed, 1 Sep 2021 16:15:42 +0200
Subject: [PATCH] Native comp add/change GCC command-line options

Added support for GCC command-line options and renamed
native-comp-driver-options to native-comp-backend-options to better
reflect which options are passed to GCC.

* lisp/emacs-lisp/comp.el: add user option 'native-comp-compiler-options'
and rename 'native-comp-driver-options' to 'native-comp-backend-options'
with changes needed to implement the feature and the rename.

* list/emacs-lisp/bytecomp.el: adapt to the change in comp.el.

* src/comp.c: add support to implement 'native-comp-compiler-options' and
the rename of driver options to backend options.
---
 lisp/emacs-lisp/bytecomp.el |  4 +-
 lisp/emacs-lisp/comp.el     | 36 +++++++++++----
 src/comp.c                  | 90 +++++++++++++++++++++++++++++--------
 3 files changed, 101 insertions(+), 29 deletions(-)

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 145cdbaa6e..c2f7b951d9 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -2257,8 +2257,8 @@ byte-compile-from-buffer
           (push `(native-comp-speed . ,native-comp-speed) byte-native-qualities)
           (defvar native-comp-debug)
           (push `(native-comp-debug . ,native-comp-debug) byte-native-qualities)
-          (defvar native-comp-driver-options)
-          (push `(native-comp-driver-options . ,native-comp-driver-options)
+          (defvar native-comp-backend-options)
+          (push `(native-comp-backend-options . ,native-comp-backend-options)
                 byte-native-qualities)
           (defvar no-native-compile)
           (push `(no-native-compile . ,no-native-compile)
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 80a1da5ad8..30febaf7d8 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -166,14 +166,24 @@ native-comp-async-query-on-exit
   :type 'boolean
   :version "28.1")
 
-(defcustom native-comp-driver-options nil
+(defcustom native-comp-compiler-options nil
+  "Command line options passed verbatim to GCC compiler.
+Note that not all options are meaningful and some options might even
+break your Emacs.  Use at own risk.
+
+Passing these options is only available in libgccjit version 9
+and above."
+  :type '(repeat string)
+  :version "28.1")
+
+(defcustom native-comp-backend-options nil
   "Options passed verbatim to the native compiler's back-end driver.
 Note that not all options are meaningful; typically only the options
 affecting the assembler and linker are likely to be useful.
 
 Passing these options is only available in libgccjit version 9
 and above."
-  :type '(repeat string)                ; FIXME is this right?
+  :type '(repeat string)
   :version "28.1")
 
 (defcustom comp-libgccjit-reproducer nil
@@ -755,8 +765,10 @@ comp-data-container
          :documentation "Default speed for this compilation unit.")
   (debug native-comp-debug :type number
          :documentation "Default debug level for this compilation unit.")
-  (driver-options native-comp-driver-options :type list
-         :documentation "Options for the GCC driver.")
+  (compiler-options native-comp-compiler-options :type list
+                    :documentation "Options for the GCC compiler.")
+  (backend-options native-comp-backend-options :type list
+                   :documentation "Options for the GCC driver.")
   (top-level-forms () :type list
                    :documentation "List of spilled top level forms.")
   (funcs-h (make-hash-table :test #'equal) :type hash-table
@@ -1347,7 +1359,9 @@ comp-spill-lap-function
                                                byte-native-qualities)
         (comp-ctxt-debug comp-ctxt) (alist-get 'native-comp-debug
                                                byte-native-qualities)
-        (comp-ctxt-driver-options comp-ctxt) (alist-get 'native-comp-driver-options
+        (comp-ctxt-compiler-options comp-ctxt) (alist-get 'native-comp-compiler-options
+                                                        byte-native-qualities)
+        (comp-ctxt-backend-options comp-ctxt) (alist-get 'native-comp-backend-options
                                                         byte-native-qualities)
         (comp-ctxt-top-level-forms comp-ctxt)
         (cl-loop
@@ -3663,8 +3677,10 @@ comp-final
                            comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                            comp-ctxt ,comp-ctxt
                            native-comp-eln-load-path ',native-comp-eln-load-path
-                           native-comp-driver-options
-                           ',native-comp-driver-options
+                           native-comp-backend-options
+                           ',native-comp-backend-options
+                           native-comp-compiler-options
+                           ',native-comp-compiler-options
                            load-path ',load-path)
                      ,native-comp-async-env-modifier-form
                      (message "Compiling %s..." ',output)
@@ -3926,8 +3942,10 @@ comp-run-async-workers
                                  comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                                  comp-async-compilation t
                                  native-comp-eln-load-path ',native-comp-eln-load-path
-                                 native-comp-driver-options
-                                 ',native-comp-driver-options
+                                 native-comp-backend-options
+                                 ',native-comp-backend-options
+                                 native-comp-compiler-options
+                                 ',native-comp-compiler-options
                                  load-path ',load-path
                                  warning-fill-column most-positive-fixnum)
                            ,native-comp-async-env-modifier-form
diff --git a/src/comp.c b/src/comp.c
index 3ea2836560..7dfb4c7f23 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -509,7 +509,8 @@ #define NUM_CAST_TYPES 15
 typedef struct {
   EMACS_INT speed;
   EMACS_INT debug;
-  Lisp_Object driver_options;
+  Lisp_Object backend_options;
+  Lisp_Object compiler_options;
   gcc_jit_context *ctxt;
   gcc_jit_type *void_type;
   gcc_jit_type *bool_type;
@@ -4361,15 +4362,14 @@ DEFUN ("comp--release-ctxt", Fcomp__release_ctxt, Scomp__release_ctxt,
 }
 
 #pragma GCC diagnostic ignored "-Waddress"
-DEFUN ("comp-native-driver-options-effective-p",
-       Fcomp_native_driver_options_effective_p,
-       Scomp_native_driver_options_effective_p,
+DEFUN ("comp-native-backend-options-effective-p",
+       Fcomp_native_backend_options_effective_p,
+       Scomp_native_backend_options_effective_p,
        0, 0, 0,
-       doc: /* Return t if `comp-native-driver-options' is effective.  */)
+       doc: /* Return t if `comp-native-backend-options' is effective.  */)
   (void)
 {
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)  \
-  || defined (WINDOWSNT)
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
   if (gcc_jit_context_add_driver_option)
     return Qt;
 #endif
@@ -4377,15 +4377,30 @@ DEFUN ("comp-native-driver-options-effective-p",
 }
 #pragma GCC diagnostic pop
 
+#pragma GCC diagnostic ignored "-Waddress"
+DEFUN ("comp-native-compiler-options-effective-p",
+       Fcomp_native_compiler_options_effective_p,
+       Scomp_native_compiler_options_effective_p,
+       0, 0, 0,
+       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
+  (void)
+{
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  if (gcc_jit_context_add_command_line_option)
+    return Qt;
+#endif
+  return Qnil;
+}
+#pragma GCC diagnostic pop
+
 static void
 add_driver_options (void)
 {
   Lisp_Object options = Fsymbol_value (Qnative_comp_driver_options);
 
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
-  || defined (WINDOWSNT)
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
   load_gccjit_if_necessary (true);
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
     FOR_EACH_TAIL (options)
       gcc_jit_context_add_driver_option (comp.ctxt,
 					 /* FIXME: Need to encode
@@ -4397,15 +4412,14 @@ add_driver_options (void)
   if (CONSP (options))
     xsignal1 (Qnative_compiler_error,
 	      build_string ("Customizing native compiler options"
-			    " via `comp-native-driver-options' is"
+			    " via `comp-native-backend-options' is"
 			    " only available on libgccjit version 9"
 			    " and above."));
 
   /* Captured `comp-native-driver-options' because file-local.  */
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
-  || defined (WINDOWSNT)
-  options = comp.driver_options;
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
+  options = comp.backend_options;
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
     FOR_EACH_TAIL (options)
       gcc_jit_context_add_driver_option (comp.ctxt,
 					 /* FIXME: Need to encode
@@ -4416,6 +4430,43 @@ add_driver_options (void)
 #endif
 }
 
+static void
+add_compiler_options (void)
+{
+  Lisp_Object options = Fsymbol_value (Qnative_comp_compiler_options);
+
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  load_gccjit_if_necessary (true);
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+    FOR_EACH_TAIL (options)
+        gcc_jit_context_add_command_line_option (comp.ctxt,
+                                                 /* FIXME: Need to encode
+                                                    this, but how? either
+                                                    ENCODE_FILE or
+                                                    ENCODE_SYSTEM.  */
+                                                 SSDATA (XCAR (options)));
+#endif
+  if (CONSP (options))
+    xsignal1 (Qnative_compiler_error,
+	      build_string ("Customizing native compiler options"
+			    " via `comp-native-compiler-options' is"
+			    " only available on libgccjit version 9"
+			    " and above."));
+
+  /* Captured `comp-native-compiler-options' because file-local.  */
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  options = comp.compiler_options;
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+    FOR_EACH_TAIL (options)
+      gcc_jit_context_add_command_line_option (comp.ctxt,
+                                               /* FIXME: Need to encode
+                                                  this, but how? either
+                                                  ENCODE_FILE or
+                                                  ENCODE_SYSTEM.  */
+                                               SSDATA (XCAR (options)));
+#endif
+}
+
 DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
        Scomp__compile_ctxt_to_file,
        1, 1, 0,
@@ -4460,7 +4511,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
   eassert (comp.speed < INT_MAX);
   comp.debug = XFIXNUM (CALL1I (comp-ctxt-debug, Vcomp_ctxt));
   eassert (comp.debug < INT_MAX);
-  comp.driver_options = CALL1I (comp-ctxt-driver-options, Vcomp_ctxt);
+  comp.backend_options = CALL1I (comp-ctxt-backend-options, Vcomp_ctxt);
 
   if (comp.debug)
       gcc_jit_context_set_bool_option (comp.ctxt,
@@ -4536,6 +4587,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
 #endif
 
   add_driver_options ();
+  add_compiler_options ();
 
   if (comp.debug > 1)
       gcc_jit_context_dump_to_file (comp.ctxt,
@@ -5241,7 +5293,8 @@ syms_of_comp (void)
 
   DEFSYM (Qnative_comp_speed, "native-comp-speed");
   DEFSYM (Qnative_comp_debug, "native-comp-debug");
-  DEFSYM (Qnative_comp_driver_options, "native-comp-driver-options");
+  DEFSYM (Qnative_comp_backend_options, "native-comp-backend-options");
+  DEFSYM (Qnative_comp_compiler_options, "native-comp-compiler-options");
   DEFSYM (Qcomp_libgccjit_reproducer, "comp-libgccjit-reproducer");
 
   /* Limple instruction set.  */
@@ -5350,7 +5403,8 @@ syms_of_comp (void)
   defsubr (&Scomp__subr_signature);
   defsubr (&Scomp_el_to_eln_rel_filename);
   defsubr (&Scomp_el_to_eln_filename);
-  defsubr (&Scomp_native_driver_options_effective_p);
+  defsubr (&Scomp_native_backend_options_effective_p);
+  defsubr (&Scomp_native_compiler_options_effective_p);
   defsubr (&Scomp__install_trampoline);
   defsubr (&Scomp__init_ctxt);
   defsubr (&Scomp__release_ctxt);
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-08-30 11:42 ` Eli Zaretskii
  2021-08-30 12:59   ` Andrea Corallo via Emacs development discussions.
  2021-08-30 14:01   ` Arthur Miller
@ 2021-09-01 14:58   ` Alex Bennée
  2021-09-01 15:10     ` Perry E. Metzger
  2021-09-01 16:04     ` Eli Zaretskii
  2 siblings, 2 replies; 24+ messages in thread
From: Alex Bennée @ 2021-09-01 14:58 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Arthur Miller, emacs-devel


Eli Zaretskii <eliz@gnu.org> writes:

>> From: Arthur Miller <arthur.miller@live.com>
>> Date: Sun, 29 Aug 2021 23:47:56 +0200
>> 
>> after the few mails the other day, I wasn't really sure if Andrea is going to
>> implement it and when. I thought it was rather a tedious manual labour and maybe
>> not so important, so I took me a liberty to implement this myself in my own, so
>> called, personal copy of Eamcs sources.
>
> Thanks.
>
>> I am not sure if I have done it correctly though, I appreciate if Andrea have
>> time to take a look; I have just mainly copied your code for backend options. It
>> seems to work for me, with a minor remark: When I pass a valid option, "native",
>> in place where it should go, I get an invalid option error. Gcc even lists it in
>> the error message as a valid option. Another option "skylake" works just 
>> fine. This seems to vary between flags. I am not sure if this is some encoding
>> error from Emacs to libgccjit, or if it is some bug in libgccjit, or is it just
>> my brain having dumps.
>
> I guess -march=native is something handled by GCC itself, and here we
> don't have it?  If you want to be sure, ask this question on the GCC
> list, or report as a bug to their Bugzilla.

Shouldn't we be ensuring -march=native for all JIT code anyway? Are the
native eln files ever considered portable/packagable or will they always
be a product of the users current system?

-- 
Alex Bennée



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-09-01 14:58   ` Alex Bennée
@ 2021-09-01 15:10     ` Perry E. Metzger
  2021-09-01 16:04     ` Eli Zaretskii
  1 sibling, 0 replies; 24+ messages in thread
From: Perry E. Metzger @ 2021-09-01 15:10 UTC (permalink / raw)
  To: emacs-devel

On 9/1/21 10:58, Alex Bennée wrote:
>
> Shouldn't we be ensuring -march=native for all JIT code anyway? Are the
> native eln files ever considered portable/packagable or will they always
> be a product of the users current system?
>
I believe the emacs binary itself contains native code in the new way of 
doing things, though I believe most eln files are considered user specific.

Perry





^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-09-01 14:58   ` Alex Bennée
  2021-09-01 15:10     ` Perry E. Metzger
@ 2021-09-01 16:04     ` Eli Zaretskii
  1 sibling, 0 replies; 24+ messages in thread
From: Eli Zaretskii @ 2021-09-01 16:04 UTC (permalink / raw)
  To: Alex Bennée; +Cc: arthur.miller, emacs-devel

> From: Alex Bennée <alex.bennee@linaro.org>
> Cc: Arthur Miller <arthur.miller@live.com>, emacs-devel@gnu.org
> Date: Wed, 01 Sep 2021 15:58:19 +0100
> 
> > I guess -march=native is something handled by GCC itself, and here we
> > don't have it?  If you want to be sure, ask this question on the GCC
> > list, or report as a bug to their Bugzilla.
> 
> Shouldn't we be ensuring -march=native for all JIT code anyway? Are the
> native eln files ever considered portable/packagable or will they always
> be a product of the users current system?

I'm not sure it's the best default.  GCC defaults are better, IMO,
certainly for the first release of this feature.  GCC doesn't use some
default without a reason.



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-09-01 14:23                     ` Arthur Miller
@ 2021-09-01 16:45                       ` Eli Zaretskii
  2021-09-01 21:06                         ` Arthur Miller
  0 siblings, 1 reply; 24+ messages in thread
From: Eli Zaretskii @ 2021-09-01 16:45 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-devel, akrl

> From: Arthur Miller <arthur.miller@live.com>
> Cc: akrl@sdf.org,  emacs-devel@gnu.org
> Date: Wed, 01 Sep 2021 16:23:21 +0200
> 
> > Almost there: the commit log message should mention the files and
> > functions where you made the changes.  Look at the other log messages
> > in git, and you will see the difference (feel free to ask if still
> > unclear).
> >
> > Thanks for working on this.
> 
> See if this is ok. I don't know how to get in ` into git message. My bash is
> complaining, but I see in some git log that Lars had quoted some names with `'.
> 
> Found also one check for WINDOWS I forgott to remove.
> 
> See if this one is ok:
> * lisp/emacs-lisp/comp.el: add user option 'native-comp-compiler-options'
> and rename 'native-comp-driver-options' to 'native-comp-backend-options'
> with changes needed to implement the feature and the rename.
> 
> * list/emacs-lisp/bytecomp.el: adapt to the change in comp.el.
> 
> * src/comp.c: add support to implement 'native-comp-compiler-options' and
> the rename of driver options to backend options.

This part should look like this:

  * lisp/emacs-lisp/comp.el ('native-comp-compiler-options): New option.
  (native-comp-driver-options): Rename to 'native-comp-backend-options'.
  * list/emacs-lisp/bytecomp.el: All users of 'native-comp-driver-options'
  changed.

  * src/comp.c (Fcomp_native_backend_options_effective_p): Renamed
  from 'Fcomp_native_driver_options_effective_p'; all callers changed.
  (Fcomp_native_compiler_options_effective_p): New function.
  (add_driver_options): Remove WINDOWSNT condition.
  (add_compiler_options): New function.
  (Fcomp__compile_ctxt_to_file): Call 'add_compiler_options'.

IOW, you need to list not only the files, but also the functions and
global variables that you change.

This will be much easier if you use "C-x 4 a" or "C-c C-d" (the latter
in the VC log buffer): they will generate the skeleton with file name
and function name for you, so you need just add the description of the
change itself, what's after the colon.

(I can fix the log message for you this time, if you are exhausted ;-)



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: Native compiler - passing command line options to C compiler
  2021-09-01 16:45                       ` Eli Zaretskii
@ 2021-09-01 21:06                         ` Arthur Miller
  0 siblings, 0 replies; 24+ messages in thread
From: Arthur Miller @ 2021-09-01 21:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, akrl

[-- Attachment #1: Type: text/plain, Size: 3057 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Arthur Miller <arthur.miller@live.com>
>> Cc: akrl@sdf.org,  emacs-devel@gnu.org
>> Date: Wed, 01 Sep 2021 16:23:21 +0200
>> 
>> > Almost there: the commit log message should mention the files and
>> > functions where you made the changes.  Look at the other log messages
>> > in git, and you will see the difference (feel free to ask if still
>> > unclear).
>> >
>> > Thanks for working on this.
>> 
>> See if this is ok. I don't know how to get in ` into git message. My bash is
>> complaining, but I see in some git log that Lars had quoted some names with `'.
>> 
>> Found also one check for WINDOWS I forgott to remove.
>> 
>> See if this one is ok:
>> * lisp/emacs-lisp/comp.el: add user option 'native-comp-compiler-options'
>> and rename 'native-comp-driver-options' to 'native-comp-backend-options'
>> with changes needed to implement the feature and the rename.
>> 
>> * list/emacs-lisp/bytecomp.el: adapt to the change in comp.el.
>> 
>> * src/comp.c: add support to implement 'native-comp-compiler-options' and
>> the rename of driver options to backend options.
>
> This part should look like this:
>
>   * lisp/emacs-lisp/comp.el ('native-comp-compiler-options): New option.
>   (native-comp-driver-options): Rename to 'native-comp-backend-options'.
>   * list/emacs-lisp/bytecomp.el: All users of 'native-comp-driver-options'
>   changed.
>
>   * src/comp.c (Fcomp_native_backend_options_effective_p): Renamed
>   from 'Fcomp_native_driver_options_effective_p'; all callers changed.
>   (Fcomp_native_compiler_options_effective_p): New function.
>   (add_driver_options): Remove WINDOWSNT condition.
>   (add_compiler_options): New function.
>   (Fcomp__compile_ctxt_to_file): Call 'add_compiler_options'.
>
> IOW, you need to list not only the files, but also the functions and
> global variables that you change.

And I who tried to be brief for once.

> This will be much easier if you use "C-x 4 a" or "C-c C-d" (the latter
> in the VC log buffer): they will generate the skeleton with file name
> and function name for you, so you need just add the description of the
> change itself, what's after the colon.

Aha. I never used Emacs vc functions, I just did everything from command line in
ansi-term. I have my bash aliases I am used to and most of my git interaction is
thru them.

I now have read about vc in the manual and looked around after you wrote this,
but I seem to be missing something in setup. I opened some vc log and C-c C-d
opened diff view as if I did a git format-patch which was nice, but then when I
actually run vc-register followed by vc-next-action, the opened log said that
diff something wasn't registered. I will try to read more and see if I can get
it to work, it seems useful to get skeleton with functions auto generated.

> (I can fix the log message for you this time, if you are exhausted ;-)

No worries, I have at least mastered git reset --soft HEAD~1. I did took your
text this time se we get over with it.

Thank you for your kind help and guidance.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: ncomp-options.patch --]
[-- Type: text/x-patch, Size: 12921 bytes --]

From 22ba2fe39d17f264799263605d2a2bb5bc22bb7b Mon Sep 17 00:00:00 2001
From: Arthur Miller <arthur.miller@live.com>
Date: Wed, 1 Sep 2021 22:52:25 +0200
Subject: [PATCH] Native comp add/change GCC command-line options

Added support for GCC command-line options and renamed
native-comp-driver-options to 'native-comp-backend-options' to better
reflect which options are passed to GCC.

* lisp/emacs-lisp/comp.el ('native-comp-compiler-options): New option.
(native-comp-driver-options): Rename to 'native-comp-backend-options'.
* list/emacs-lisp/bytecomp.el: All users of 'native-comp-driver-options'
changed.

* src/comp.c (Fcomp_native_backend_options_effective_p): Renamed
from 'Fcomp_native_driver_options_effective_p'; all callers changed.
(Fcomp_native_compiler_options_effective_p): New function.
(add_driver_options): Remove WINDOWSNT condition.
(add_compiler_options): New function.
(Fcomp__compile_ctxt_to_file): Call 'add_compiler_options'.
---
 lisp/emacs-lisp/bytecomp.el |  4 +-
 lisp/emacs-lisp/comp.el     | 36 +++++++++++----
 src/comp.c                  | 90 +++++++++++++++++++++++++++++--------
 3 files changed, 101 insertions(+), 29 deletions(-)

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 145cdbaa6e..c2f7b951d9 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -2257,8 +2257,8 @@ byte-compile-from-buffer
           (push `(native-comp-speed . ,native-comp-speed) byte-native-qualities)
           (defvar native-comp-debug)
           (push `(native-comp-debug . ,native-comp-debug) byte-native-qualities)
-          (defvar native-comp-driver-options)
-          (push `(native-comp-driver-options . ,native-comp-driver-options)
+          (defvar native-comp-backend-options)
+          (push `(native-comp-backend-options . ,native-comp-backend-options)
                 byte-native-qualities)
           (defvar no-native-compile)
           (push `(no-native-compile . ,no-native-compile)
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 80a1da5ad8..30febaf7d8 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -166,14 +166,24 @@ native-comp-async-query-on-exit
   :type 'boolean
   :version "28.1")
 
-(defcustom native-comp-driver-options nil
+(defcustom native-comp-compiler-options nil
+  "Command line options passed verbatim to GCC compiler.
+Note that not all options are meaningful and some options might even
+break your Emacs.  Use at own risk.
+
+Passing these options is only available in libgccjit version 9
+and above."
+  :type '(repeat string)
+  :version "28.1")
+
+(defcustom native-comp-backend-options nil
   "Options passed verbatim to the native compiler's back-end driver.
 Note that not all options are meaningful; typically only the options
 affecting the assembler and linker are likely to be useful.
 
 Passing these options is only available in libgccjit version 9
 and above."
-  :type '(repeat string)                ; FIXME is this right?
+  :type '(repeat string)
   :version "28.1")
 
 (defcustom comp-libgccjit-reproducer nil
@@ -755,8 +765,10 @@ comp-data-container
          :documentation "Default speed for this compilation unit.")
   (debug native-comp-debug :type number
          :documentation "Default debug level for this compilation unit.")
-  (driver-options native-comp-driver-options :type list
-         :documentation "Options for the GCC driver.")
+  (compiler-options native-comp-compiler-options :type list
+                    :documentation "Options for the GCC compiler.")
+  (backend-options native-comp-backend-options :type list
+                   :documentation "Options for the GCC driver.")
   (top-level-forms () :type list
                    :documentation "List of spilled top level forms.")
   (funcs-h (make-hash-table :test #'equal) :type hash-table
@@ -1347,7 +1359,9 @@ comp-spill-lap-function
                                                byte-native-qualities)
         (comp-ctxt-debug comp-ctxt) (alist-get 'native-comp-debug
                                                byte-native-qualities)
-        (comp-ctxt-driver-options comp-ctxt) (alist-get 'native-comp-driver-options
+        (comp-ctxt-compiler-options comp-ctxt) (alist-get 'native-comp-compiler-options
+                                                        byte-native-qualities)
+        (comp-ctxt-backend-options comp-ctxt) (alist-get 'native-comp-backend-options
                                                         byte-native-qualities)
         (comp-ctxt-top-level-forms comp-ctxt)
         (cl-loop
@@ -3663,8 +3677,10 @@ comp-final
                            comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                            comp-ctxt ,comp-ctxt
                            native-comp-eln-load-path ',native-comp-eln-load-path
-                           native-comp-driver-options
-                           ',native-comp-driver-options
+                           native-comp-backend-options
+                           ',native-comp-backend-options
+                           native-comp-compiler-options
+                           ',native-comp-compiler-options
                            load-path ',load-path)
                      ,native-comp-async-env-modifier-form
                      (message "Compiling %s..." ',output)
@@ -3926,8 +3942,10 @@ comp-run-async-workers
                                  comp-libgccjit-reproducer ,comp-libgccjit-reproducer
                                  comp-async-compilation t
                                  native-comp-eln-load-path ',native-comp-eln-load-path
-                                 native-comp-driver-options
-                                 ',native-comp-driver-options
+                                 native-comp-backend-options
+                                 ',native-comp-backend-options
+                                 native-comp-compiler-options
+                                 ',native-comp-compiler-options
                                  load-path ',load-path
                                  warning-fill-column most-positive-fixnum)
                            ,native-comp-async-env-modifier-form
diff --git a/src/comp.c b/src/comp.c
index 3ea2836560..7dfb4c7f23 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -509,7 +509,8 @@ #define NUM_CAST_TYPES 15
 typedef struct {
   EMACS_INT speed;
   EMACS_INT debug;
-  Lisp_Object driver_options;
+  Lisp_Object backend_options;
+  Lisp_Object compiler_options;
   gcc_jit_context *ctxt;
   gcc_jit_type *void_type;
   gcc_jit_type *bool_type;
@@ -4361,15 +4362,14 @@ DEFUN ("comp--release-ctxt", Fcomp__release_ctxt, Scomp__release_ctxt,
 }
 
 #pragma GCC diagnostic ignored "-Waddress"
-DEFUN ("comp-native-driver-options-effective-p",
-       Fcomp_native_driver_options_effective_p,
-       Scomp_native_driver_options_effective_p,
+DEFUN ("comp-native-backend-options-effective-p",
+       Fcomp_native_backend_options_effective_p,
+       Scomp_native_backend_options_effective_p,
        0, 0, 0,
-       doc: /* Return t if `comp-native-driver-options' is effective.  */)
+       doc: /* Return t if `comp-native-backend-options' is effective.  */)
   (void)
 {
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)  \
-  || defined (WINDOWSNT)
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
   if (gcc_jit_context_add_driver_option)
     return Qt;
 #endif
@@ -4377,15 +4377,30 @@ DEFUN ("comp-native-driver-options-effective-p",
 }
 #pragma GCC diagnostic pop
 
+#pragma GCC diagnostic ignored "-Waddress"
+DEFUN ("comp-native-compiler-options-effective-p",
+       Fcomp_native_compiler_options_effective_p,
+       Scomp_native_compiler_options_effective_p,
+       0, 0, 0,
+       doc: /* Return t if `comp-native-compiler-options' is effective.  */)
+  (void)
+{
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  if (gcc_jit_context_add_command_line_option)
+    return Qt;
+#endif
+  return Qnil;
+}
+#pragma GCC diagnostic pop
+
 static void
 add_driver_options (void)
 {
   Lisp_Object options = Fsymbol_value (Qnative_comp_driver_options);
 
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
-  || defined (WINDOWSNT)
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
   load_gccjit_if_necessary (true);
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
     FOR_EACH_TAIL (options)
       gcc_jit_context_add_driver_option (comp.ctxt,
 					 /* FIXME: Need to encode
@@ -4397,15 +4412,14 @@ add_driver_options (void)
   if (CONSP (options))
     xsignal1 (Qnative_compiler_error,
 	      build_string ("Customizing native compiler options"
-			    " via `comp-native-driver-options' is"
+			    " via `comp-native-backend-options' is"
 			    " only available on libgccjit version 9"
 			    " and above."));
 
   /* Captured `comp-native-driver-options' because file-local.  */
-#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)	\
-  || defined (WINDOWSNT)
-  options = comp.driver_options;
-  if (!NILP (Fcomp_native_driver_options_effective_p ()))
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option)
+  options = comp.backend_options;
+  if (!NILP (Fcomp_native_backend_options_effective_p ()))
     FOR_EACH_TAIL (options)
       gcc_jit_context_add_driver_option (comp.ctxt,
 					 /* FIXME: Need to encode
@@ -4416,6 +4430,43 @@ add_driver_options (void)
 #endif
 }
 
+static void
+add_compiler_options (void)
+{
+  Lisp_Object options = Fsymbol_value (Qnative_comp_compiler_options);
+
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  load_gccjit_if_necessary (true);
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+    FOR_EACH_TAIL (options)
+        gcc_jit_context_add_command_line_option (comp.ctxt,
+                                                 /* FIXME: Need to encode
+                                                    this, but how? either
+                                                    ENCODE_FILE or
+                                                    ENCODE_SYSTEM.  */
+                                                 SSDATA (XCAR (options)));
+#endif
+  if (CONSP (options))
+    xsignal1 (Qnative_compiler_error,
+	      build_string ("Customizing native compiler options"
+			    " via `comp-native-compiler-options' is"
+			    " only available on libgccjit version 9"
+			    " and above."));
+
+  /* Captured `comp-native-compiler-options' because file-local.  */
+#if defined (LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option)
+  options = comp.compiler_options;
+  if (!NILP (Fcomp_native_compiler_options_effective_p ()))
+    FOR_EACH_TAIL (options)
+      gcc_jit_context_add_command_line_option (comp.ctxt,
+                                               /* FIXME: Need to encode
+                                                  this, but how? either
+                                                  ENCODE_FILE or
+                                                  ENCODE_SYSTEM.  */
+                                               SSDATA (XCAR (options)));
+#endif
+}
+
 DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
        Scomp__compile_ctxt_to_file,
        1, 1, 0,
@@ -4460,7 +4511,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
   eassert (comp.speed < INT_MAX);
   comp.debug = XFIXNUM (CALL1I (comp-ctxt-debug, Vcomp_ctxt));
   eassert (comp.debug < INT_MAX);
-  comp.driver_options = CALL1I (comp-ctxt-driver-options, Vcomp_ctxt);
+  comp.backend_options = CALL1I (comp-ctxt-backend-options, Vcomp_ctxt);
 
   if (comp.debug)
       gcc_jit_context_set_bool_option (comp.ctxt,
@@ -4536,6 +4587,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
 #endif
 
   add_driver_options ();
+  add_compiler_options ();
 
   if (comp.debug > 1)
       gcc_jit_context_dump_to_file (comp.ctxt,
@@ -5241,7 +5293,8 @@ syms_of_comp (void)
 
   DEFSYM (Qnative_comp_speed, "native-comp-speed");
   DEFSYM (Qnative_comp_debug, "native-comp-debug");
-  DEFSYM (Qnative_comp_driver_options, "native-comp-driver-options");
+  DEFSYM (Qnative_comp_backend_options, "native-comp-backend-options");
+  DEFSYM (Qnative_comp_compiler_options, "native-comp-compiler-options");
   DEFSYM (Qcomp_libgccjit_reproducer, "comp-libgccjit-reproducer");
 
   /* Limple instruction set.  */
@@ -5350,7 +5403,8 @@ syms_of_comp (void)
   defsubr (&Scomp__subr_signature);
   defsubr (&Scomp_el_to_eln_rel_filename);
   defsubr (&Scomp_el_to_eln_filename);
-  defsubr (&Scomp_native_driver_options_effective_p);
+  defsubr (&Scomp_native_backend_options_effective_p);
+  defsubr (&Scomp_native_compiler_options_effective_p);
   defsubr (&Scomp__install_trampoline);
   defsubr (&Scomp__init_ctxt);
   defsubr (&Scomp__release_ctxt);
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2021-09-01 21:06 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <AM9PR09MB49778CFA83AA6697D09ED01B96CA9@AM9PR09MB4977.eurprd09.prod.outlook.com>
2021-08-30  9:36 ` Native compiler - passing command line options to C compiler Andrea Corallo via Emacs development discussions.
2021-08-30 13:56   ` Arthur Miller
2021-08-30 14:05     ` Andrea Corallo via Emacs development discussions.
2021-08-30 11:42 ` Eli Zaretskii
2021-08-30 12:59   ` Andrea Corallo via Emacs development discussions.
2021-08-30 13:28     ` Eli Zaretskii
2021-08-30 14:28       ` Andrea Corallo via Emacs development discussions.
2021-08-30 15:00         ` Arthur Miller
2021-08-30 15:38           ` Andrea Corallo via Emacs development discussions.
2021-08-31  5:36             ` Arthur Miller
2021-08-31  8:06               ` Andrea Corallo via Emacs development discussions.
2021-08-31 13:01               ` Eli Zaretskii
2021-08-31 22:53                 ` Arthur Miller
2021-09-01 11:45                   ` Eli Zaretskii
2021-09-01 14:23                     ` Arthur Miller
2021-09-01 16:45                       ` Eli Zaretskii
2021-09-01 21:06                         ` Arthur Miller
2021-08-30 16:01           ` Eli Zaretskii
2021-08-30 15:50         ` Eli Zaretskii
2021-08-30 14:01   ` Arthur Miller
2021-08-30 14:03     ` Eli Zaretskii
2021-09-01 14:58   ` Alex Bennée
2021-09-01 15:10     ` Perry E. Metzger
2021-09-01 16:04     ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).