Re: Deferring native compilation finalization until idle

Stéphane Marks <[email protected]> Sat, 25 Jul 2026 19:56:26 +0200
Newsgroups gmane.emacs.devel
Message-ID <CAN+1HbqBU7SpDj=ftc-SOavdq5LwvUufH7WPfhdL47ESLrNhYw@mail.gmail.com>
On Sat, Jul 25, 2026 at 1:37 PM Stéphane Marks <[email protected]> wrote:

> On Sat, Jul 25, 2026 at 1:11 PM Stéphane Marks <[email protected]>
> wrote:
>
>> On Sat, Jul 25, 2026 at 12:29 PM Stéphane Marks <[email protected]>
>> wrote:
>>
>>> On Sat, Jul 25, 2026 at 12:22 PM Aaron Jensen <[email protected]>
>>> wrote:
>>>
>>>> On Sat, Jul 25, 2026 at 9:18 AM, Stéphane Marks <[email protected]>
>>>> wrote:
>>>>
>>>>> On Sat, Jul 25, 2026 at 12:14 PM Aaron Jensen <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> On Sat, Jul 25, 2026 at 9:04 AM, Stéphane Marks <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>> FWIW, my eln-cache this morning, starting fresh from Thursday, has
>>>>>>> 146 files with seldom used packages uncompiled, of course.  Rebuilding that
>>>>>>> cache was entirely asynchronous, perhaps except for the trampolines.  I
>>>>>>> have not tried setting native-comp-enable-subr-trampolines to nil in
>>>>>>> early-init.el to see if this bypasses the delays that you're seeing.  Have
>>>>>>> you tried that?
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>> Setting native-comp-enable-subr-trampolines to nil does not
>>>>>> noticeably reduce the stutter for me.
>>>>>>
>>>>>> Ending up with only 146 files likely means that even if you were to
>>>>>> not have one of the workarounds in place, you would not notice as much
>>>>>> stutter as one who had more.
>>>>>>
>>>>>> My guess is that if you were to try my config, or someone else's that
>>>>>> notices the issue and not disable macOS's security checks, you too would
>>>>>> notice the stutter.
>>>>>>
>>>>>> I work with others that use macOS. I can survey them to see how many
>>>>>> of them have issues if that would be convincing to anyone. However, I think
>>>>>> the facts are pretty well established and ultimately it's a decision as to
>>>>>> whether or not the maintainers want to account for the particularities of
>>>>>> macOS's bundle validation process by loading the bundle within the async
>>>>>> worker (and take on the additional maintenance burden).
>>>>>>
>>>>>> Personally, I have my workaround, so I'm "fine". But I'm not a fan of
>>>>>> macOS users that have have sufficient packages having an experience that
>>>>>> leaves them with the opinion that Emacs has poor startup performance, or
>>>>>> native compilation makes things worse, etc. Yes, those are
>>>>>> narrowly-informed opinions, but I'm sure many users would not take the time
>>>>>> to compare their startup performance to other OS's and/or to find this
>>>>>> thread to better understand the depths of the problem. Instead, they'll
>>>>>> just have a bad taste and deal with it every time they install a new
>>>>>> version of Emacs.
>>>>>>
>>>>>
>>>>> From first principles, what package is waiting to be built in the
>>>>> eln-cache that Emacs is waiting for that prevents input?  AFAIK, the byte
>>>>> code is first loaded and available to run and only then replaced on-the-fly
>>>>> when native code is produced without error to replace it in the symbol's
>>>>> function cell.
>>>>>
>>>>
>>>> No, this is not what the problem is. That's the thing that I'm saying
>>>> has been pretty well established in this thread, though it seems not well
>>>> enough.
>>>>
>>>> The problem is that macOS, upon first *loading* the bundle in the main
>>>> Emacs process will undergo a security check (the one disabled by the
>>>> entitlements call you posted). This is a synchronous, blocking operation.
>>>> MacOS does not allow the process to load the bundle until it has verified
>>>> it, so the load is blocking. During this time, Emacs cannot receive input
>>>> because the main thread is completely blocked by the operating system. As
>>>> soon as you chain together hundreds of these macOS-initiated blocking
>>>> operations (every single bundle being loaded) you have a very poor,
>>>> stuttery, slow experience.
>>>>
>>>
>>> Okay so it is just the macOS binary scanner then and like any virus
>>> scanner interferes at the OS level.  A binary has to either opt out (as
>>> PROBLEMS document a method to do and the jimeh build does), or has to
>>> otherwise be whitelisted.  Every binary on macOS undergoes the same thing
>>> without being opted out so this isn't an Emacs issue.  I agree that Emacs
>>> loads "DLLs" and those can amplify the OS-imposed delay.  But only when
>>> they're loaded into memory.  Someone with a jillion packages surely doesn't
>>> need them all at once and can benefit from a carefully-crafted init.el with
>>> deferred package loading.
>>>
>>
>> FWIW, I did investigate whether we could enable DYLD environment variable
>> (a different codesign entitlement) to see if we could allow the Emacs
>> loader to temporarily disable library validation when loading a file from
>> the eln cache.  I also took a casual look at the source code here
>> https://github.com/apple-oss-distributions/dyld I failed to find a way
>> to create a finer-grained approach.  Perhaps an enterprising person will
>> dig something up.  For now, it seems it's all or nothing.
>>
>
> One thing I did not look at that someone may want to look into is whether
> it is possible to codesign the files in the eln cache using the same
> credentials/opt outs as the Emacs bundle (or ad-hoc signing) to avoid
> library validation.  If that works, perhaps a hook could be added to the
> native compiler to allow some post processing of each file to codesign it
> as a one-time cost.
>

One more avenue of investigation could be to leverage the JIT exception as
documented here
https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.security.cs.allow-jit?language=objc
and
Emacs on macOS would have to do some more work to mmap an eln file onto RAM
pages flagged with execution permissions.