unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#64494: 30.0.50; Recursive load error with native-compile
@ 2023-07-06 11:45 German Pacenza
  2023-07-06 15:09 ` Eli Zaretskii
  0 siblings, 1 reply; 7+ messages in thread
From: German Pacenza @ 2023-07-06 11:45 UTC (permalink / raw)
  To: 64494


Steps to reproduce:
clean native compile cache
emacs -Q
C-x r b (bookmark-jump)

Error message appears:
emacs-lisp-compilation-mode: Recursive load: "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/cl-lib.elc", "/home/german/repos/emacs/lisp/emacs-
 lisp/pp.elc", "/home/german/repos/emacs/lisp/bookmark.elc"

Reverting commit 40492581f96626e405e4b453456b8c9b83822c97 fixes the issue.


In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
 3.24.38, cairo version 1.17.8) of 2023-07-06 built on KRONOS
Repository revision: 40492581f96626e405e4b453456b8c9b83822c97
Repository branch: master
System Description: Manjaro Linux

Configured using:
 'configure --with-pgtk --with-native-compilation --without-libsystemd
 --without-compress-install --prefix=/home/german/.local/emacs'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PGTK PNG
RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER
WEBP XIM GTK3 ZLIB

Important settings:
  value of $LC_MONETARY: es_AR.UTF-8
  value of $LC_NUMERIC: es_AR.UTF-8
  value of $LC_TIME: es_AR.UTF-8
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  vertico-mode: t
  savehist-mode: t
  popper-mode: t
  minibuffer-depth-indicate-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  window-divider-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/german/.emacs.d/elpa/embark-consult-0.7/embark-org hides /home/german/.emacs.d/elpa/embark-0.22.1/embark-org
/home/german/.emacs.d/elpa/transient-0.4.1/transient hides /home/german/.local/emacs/share/emacs/30.0.50/lisp/transient

Features:
(shadow sort mail-extr emacsbug message mailcap yank-media puny dired
dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg rfc6068
epg-config gnus-util time-date mm-decode mm-bodies mm-encode mail-parse
rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045
ietf-drums mm-util mail-prsvr mail-utils compile text-property-search
comint ansi-osc ansi-color ring comp comp-cstr rx vertico savehist
popper subr-x transient cl-extra help-mode cl-seq format-spec edmacro
kmacro eieio byte-opt bytecomp byte-compile eieio-core cl-macs gv compat
mb-depth g3r-light-theme info autothemer-autoloads doom-themes-autoloads
ef-themes-autoloads embark-consult-autoloads consult-autoloads
embark-autoloads fontify-face-autoloads kurecolor-autoloads
magit-autoloads git-commit-autoloads magit-section-autoloads
dash-autoloads orderless-autoloads popper-autoloads
rainbow-mode-autoloads s-autoloads transient-autoloads vertico-autoloads
with-editor-autoloads compat-autoloads yuck-mode-autoloads warnings
icons cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/pgtk-win pgtk-win term/common-win pgtk-dnd tool-bar dnd fontset
image regexp-opt fringe tabulated-list replace newcomment text-mode
lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch
easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind inotify
dynamic-setting system-font-setting font-render-setting cairo gtk pgtk
lcms2 multi-tty move-toolbar make-network-process native-compile emacs)

Memory information:
((conses 16 129884 100287) (symbols 48 10014 5)
 (strings 32 32148 18103) (string-bytes 1 1081003) (vectors 16 21625)
 (vector-slots 8 412849 137704) (floats 8 58 241)
 (intervals 56 476 67) (buffers 984 11))

-- 
German Pacenza





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

* bug#64494: 30.0.50; Recursive load error with native-compile
  2023-07-06 11:45 bug#64494: 30.0.50; Recursive load error with native-compile German Pacenza
@ 2023-07-06 15:09 ` Eli Zaretskii
  2023-07-07 17:02   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 7+ messages in thread
From: Eli Zaretskii @ 2023-07-06 15:09 UTC (permalink / raw)
  To: German Pacenza, Andrea Corallo, Stefan Monnier; +Cc: 64494

> From: German Pacenza <germanp82@hotmail.com>
> Date: Thu, 06 Jul 2023 08:45:10 -0300
> 
> 
> Steps to reproduce:
> clean native compile cache
> emacs -Q
> C-x r b (bookmark-jump)
> 
> Error message appears:
> emacs-lisp-compilation-mode: Recursive load: "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/ring.elc", "/home/german/repos/emacs/lisp/comint.elc", "/home/german/repos/emacs/lisp/progmodes/compile.elc", "/home/german/repos/emacs/lisp/emacs-lisp/cl-lib.elc", "/home/german/repos/emacs/lisp/emac
 s-lisp/pp.elc", "/home/german/repos/emacs/lisp/bookmark.elc"
> 
> Reverting commit 40492581f96626e405e4b453456b8c9b83822c97 fixes the issue.

Thanks, I've reverted that commit for now.

Andrea, Stefan: any ideas for how to allow emacs-lisp-compilation-mode
in async compilation buffers without triggering this recursive-load
nastiness?





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

* bug#64494: 30.0.50; Recursive load error with native-compile
  2023-07-06 15:09 ` Eli Zaretskii
@ 2023-07-07 17:02   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-07-07 18:23     ` Eli Zaretskii
  2023-07-14  1:29     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 7+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-07-07 17:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: German Pacenza, 64494, Andrea Corallo

> Andrea, Stefan: any ideas for how to allow emacs-lisp-compilation-mode
> in async compilation buffers without triggering this recursive-load
> nastiness?

I'm wondering if instead of having the C code do:

    /* This is so deferred compilation is able to compile comp
       dependencies breaking circularity.  */
    if (comp__compilable)
      {
        /* Startup is done, comp is usable.  */
        CALL0I (startup--require-comp-safely);
        CALLN (Ffuncall, intern_c_string ("native--compile-async"),
               src, Qnil, Qlate);
      }
    else
      Vcomp__delayed_sources = Fcons (src, Vcomp__delayed_sources);

we shouldn't just do something like

    pending_funcalls
        = Fcons (list (Qnative__compile_async, src, Qnil, Qlate),
                 pending_funcalls);

I.e. never call native--compile-async synchronously.
The patch below seems to work so far, tho I haven't tried bootstrapping yet.


        Stefan


diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 77584b692a4..4892733d456 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -4230,6 +4230,7 @@ native-compile-async-skip-p
                       (string-match-p re file))
                     native-comp-jit-compilation-deny-list))))
 
+;;;###autoload
 (defun native--compile-async (files &optional recursively load selector)
   ;; BEWARE, this function is also called directly from C.
   "Compile FILES asynchronously.
diff --git a/lisp/startup.el b/lisp/startup.el
index 5a389294e78..7f601668369 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -520,27 +520,6 @@ startup--xdg-or-homedot
       xdg-dir)
      (t emacs-d-dir))))
 
-(defvar comp--compilable)
-(defvar comp--delayed-sources)
-(defun startup--require-comp-safely ()
-  "Require the native compiler avoiding circular dependencies."
-  (when (featurep 'native-compile)
-    ;; Require comp with `comp--compilable' set to nil to break
-    ;; circularity.
-    (let ((comp--compilable nil))
-      (require 'comp))
-    (native--compile-async comp--delayed-sources nil 'late)
-    (setq comp--delayed-sources nil)))
-
-(declare-function native--compile-async "comp.el"
-                  (files &optional recursively load selector))
-(defun startup--honor-delayed-native-compilations ()
-  "Honor pending delayed deferred native compilations."
-  (when (and (native-comp-available-p)
-             comp--delayed-sources)
-    (startup--require-comp-safely))
-  (setq comp--compilable t))
-
 (defvar native-comp-eln-load-path)
 (defvar native-comp-jit-compilation)
 (defvar native-comp-enable-subr-trampolines)
@@ -846,8 +825,7 @@ normal-top-level
                                 nil)))
             (setq env (cdr env)))))
       (when display
-        (setq process-environment (delete display process-environment)))))
-  (startup--honor-delayed-native-compilations))
+        (setq process-environment (delete display process-environment))))))
 
 ;; Precompute the keyboard equivalents in the menu bar items.
 ;; Command-line options supported by tty's:
diff --git a/src/comp.c b/src/comp.c
index 013ac6358c1..003bec38efa 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -5199,17 +5199,9 @@ maybe_defer_native_compilation (Lisp_Object function_name,
 
   Fputhash (function_name, definition, Vcomp_deferred_pending_h);
 
-  /* This is so deferred compilation is able to compile comp
-     dependencies breaking circularity.  */
-  if (comp__compilable)
-    {
-      /* Startup is done, comp is usable.  */
-      CALL0I (startup--require-comp-safely);
-      CALLN (Ffuncall, intern_c_string ("native--compile-async"),
-	     src, Qnil, Qlate);
-    }
-  else
-    Vcomp__delayed_sources = Fcons (src, Vcomp__delayed_sources);
+  pending_funcalls
+    = Fcons (list (Qnative__compile_async, src, Qnil, Qlate),
+             pending_funcalls);
 }
 
 \f
@@ -5798,6 +5790,8 @@ syms_of_comp (void)
         build_pure_c_string ("eln file inconsistent with current runtime "
 			     "configuration, please recompile"));
 
+  DEFSYM (Qnative__compile_async, "native--compile-async");
+  
   defsubr (&Scomp__subr_signature);
   defsubr (&Scomp_el_to_eln_rel_filename);
   defsubr (&Scomp_el_to_eln_filename);






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

* bug#64494: 30.0.50; Recursive load error with native-compile
  2023-07-07 17:02   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-07-07 18:23     ` Eli Zaretskii
  2023-07-07 20:18       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-07-14  1:29     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 7+ messages in thread
From: Eli Zaretskii @ 2023-07-07 18:23 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: germanp82, 64494, acorallo

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: German Pacenza <germanp82@hotmail.com>,  Andrea Corallo
>  <acorallo@gnu.org>,  64494@debbugs.gnu.org
> Date: Fri, 07 Jul 2023 13:02:55 -0400
> 
> The patch below seems to work so far, tho I haven't tried bootstrapping yet.

Thanks, but does it allow to put back the change I reverted?  It isn't
in the patch, so I'm not sure if you tried that.





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

* bug#64494: 30.0.50; Recursive load error with native-compile
  2023-07-07 18:23     ` Eli Zaretskii
@ 2023-07-07 20:18       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-07-08  1:22         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 7+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-07-07 20:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: germanp82, 64494, acorallo

> Thanks, but does it allow to put back the change I reverted?

I believe so, yes.

> It isn't in the patch, so I'm not sure if you tried that.

The patch was tested against commit 40492581f9 (i.e. the commit just
before the reversion).

The way it works is that instead of having the C code call
`native--compile-async` (which loads `comp.el`) right in the middle of
loading another file, it delays the call to the next time Emacs waits.
After all `native--compile-async` doesn't do anything immediately urgent
since all it does is schedule a future compilation.

There's another thing I don't quite understand about our code here: why
do we call `native--compile-async` from `defalias` (via
`maybe_defer_native_compilation`) rather than doing it from something
like `after-load-functions`?


        Stefan






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

* bug#64494: 30.0.50; Recursive load error with native-compile
  2023-07-07 20:18       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-07-08  1:22         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 7+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-07-08  1:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: germanp82, 64494, acorallo

> There's another thing I don't quite understand about our code here: why
> do we call `native--compile-async` from `defalias` (via
> `maybe_defer_native_compilation`) rather than doing it from something
> like `after-load-functions`?

Hmm... I see that its not done for the "deferred compilation" but it's
done for the subsequent *reload* (which replaces the previously loaded
bytecode functions with their newly native-compiled version).

The problem being that we shouldn't load the .eln (and thus replace
the bytecode with native code) if the bytecode has been replaced with
something else in the mean time.

IOW, we need some way to detect when changes occur to the `.elc`-defined
functions between the time the `.elc` file is loaded and the time the
`.eln` file is available for load.  This is done by storing the `.elc`
definitions in an auxiliary hash-table (`comp-deferred-pending-h`) so
they can be compared to the current definition before replacing it withe
new definition from`.eln`.

So, if we want to do it from `after-load-functions`, we need to use
`load-history` to collect all the definitions and populate
`comp-deferred-pending-h`.


        Stefan






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

* bug#64494: 30.0.50; Recursive load error with native-compile
  2023-07-07 17:02   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-07-07 18:23     ` Eli Zaretskii
@ 2023-07-14  1:29     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 7+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-07-14  1:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: German Pacenza, 64494-done, Andrea Corallo

> we shouldn't just do something like
>
>     pending_funcalls
>         = Fcons (list (Qnative__compile_async, src, Qnil, Qlate),
>                  pending_funcalls);
>
> I.e. never call native--compile-async synchronously.
> The patch below seems to work so far, tho I haven't tried bootstrapping yet.

After further tests, I pushed it to `master`, along with the
re-installation of commit 140492581f96.


        Stefan






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

end of thread, other threads:[~2023-07-14  1:29 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-06 11:45 bug#64494: 30.0.50; Recursive load error with native-compile German Pacenza
2023-07-06 15:09 ` Eli Zaretskii
2023-07-07 17:02   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-07-07 18:23     ` Eli Zaretskii
2023-07-07 20:18       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-07-08  1:22         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-07-14  1:29     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors

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