emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Finalizing 'inhibit-automatic-native-compilation'


From: Andrea Corallo
Subject: Re: Finalizing 'inhibit-automatic-native-compilation'
Date: Fri, 10 Feb 2023 16:53:59 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux)

Aymeric Agon-Rambosson <aymeric.agon@yandex.com> writes:

> Le jeudi 9 février 2023 à 12:11, Eli Zaretskii <eliz@gnu.org> a écrit
> :
>
>>> Would it possible to add a constant value, like
>>> 'compile-but-no-output, that would have exactly the second
>>> behaviour I was mentioning before, that is compiling trampolines
>>> but not even trying to output them anywhere, by passing nil as the
>>> last argument of `comp--native-compile' ?
>>
>> Argh, the last argument to comp--native-compile is not documented.
>> AFAIR, setting it to nil means the trampoline will be written to
>> temporary-file-directory, right?  Because I don't think we can
>> compile
>> a trampoline without writing it to some file, from which we will
>> thereafter load it.  (Andrea, please correct me if I'm wrong.) If
>> so,
>> we could assume Lisp programs will use temporary-file-directory if
>> they need this, would that be good enough?
>
> I'm asking this because this is already what
> `inhibit-automatic-native-compilation' does :
>
> (defun comp-trampoline-compile (subr-name)
>  "Synthesize compile and return a trampoline for SUBR-NAME."
>  (let* ((lambda-list (comp-make-lambda-list-from-subr
>                       (symbol-function subr-name)))
>         ;; The synthesized trampoline must expose the exact same
>            ABI of
>         ;; the primitive we are replacing in the function reloc
>            table.
>         (form `(lambda ,lambda-list
>                  (let ((f #',subr-name))
>                    (,(if (memq '&rest lambda-list) #'apply
>                    'funcall)
>                     f
>                     ,@(cl-loop
>                        for arg in lambda-list
>                        unless (memq arg '(&optional &rest))
>                        collect arg)))))
>         ;; Use speed 1 for compilation speed and not to optimize
>            away
>         ;; funcall calls!
>         (byte-optimize nil)
>         (native-comp-speed 1)
>         (lexical-binding t))
>    (comp--native-compile
>     form nil
>     ;; If we've disabled nativecomp, don't write the trampolines
>        to
>     ;; the eln cache (but create them).
>     (unless inhibit-automatic-native-compilation
>       (cl-loop
>        for dir in (if native-compile-target-directory
>                       (list (expand-file-name
>                       comp-native-version-dir
>                                               
> native-compile-target-directory))
>                     (comp-eln-load-path-eff))
>        for f = (expand-file-name
>                 (comp-trampoline-filename subr-name)
>                 dir)
>        unless (file-exists-p dir)
>          do (ignore-errors
>               (make-directory dir t)
>               (cl-return f))
>        when (file-writable-p f)
>          do (cl-return f)
>        finally (error "Cannot find suitable directory for output
>        in \
> `native-comp-eln-load-path'"))))))
>
> The line :
>
> (unless inhibit-automatic-native-compilation
>
> Could be replaced with :
>
> (unless (equal comp-enable-subr-trampolines 'compile-but-no-output)
>
> To the same effect (the current effect of
> `inhibit-automatic-native-compilation', with which we haven't had
> issues so far).
>
> As a side note, Lars' comment seems to say that it is completely
> possible to attach a trampoline to a primitive without saving said
> trampoline anywhere (not even in `temporary-file-directory').

Unfortunatelly it is not, in posix to dynamically load code dlopen is
used and a file is necessary.  See DLOPEN(3)

Best Regards

  Andrea



reply via email to

[Prev in Thread] Current Thread [Next in Thread]