emacs-diffs
[Top][All Lists]
Advanced

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

feature/native-comp 7f5d1e9 4/7: Set invocation variables during dump lo


From: Andrea Corallo
Subject: feature/native-comp 7f5d1e9 4/7: Set invocation variables during dump load.
Date: Sun, 12 Apr 2020 12:13:38 -0400 (EDT)

branch: feature/native-comp
commit 7f5d1e9aa8e3ad27700dbce2b8951ffde1054aaf
Author: Andrea Corallo <address@hidden>
Commit: Andrea Corallo <address@hidden>

    Set invocation variables during dump load.
    
    Vinvocation_directory must be set during dump load process to support
    .eln load.
    
        * src/pdumper.h: (pdumper_load): Add argv0 and original_pwd
        parameters.
    
        * src/pdumper.c (pdumper_load): Add argv0 and original_pwd
        parameter plus call 'set_invocation_vars'.
    
        * src/lisp.h (set_invocation_vars): New function.
    
        * src/emacs.c (set_invocation_vars): New function.
        (init_cmdargs): Move logic into 'set_invocation_vars' and call it.
        (load_pdump): Add 'original_pwd' parameter and update calls to
        'pdumper_load'.
        (main): Set emacs_wd earlier and update call to 'pdumper_load'.
---
 src/emacs.c   | 67 ++++++++++++++++++++++++++++++++++++-----------------------
 src/lisp.h    |  1 +
 src/pdumper.c |  5 ++++-
 src/pdumper.h |  3 ++-
 4 files changed, 48 insertions(+), 28 deletions(-)

diff --git a/src/emacs.c b/src/emacs.c
index fcc02a3..2c90825 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -403,34 +403,35 @@ terminate_due_to_signal (int sig, int backtrace_limit)
   /* This shouldn't be executed, but it prevents a warning.  */
   exit (1);
 }
-
-/* Code for dealing with Lisp access to the Unix command line.  */
 
-static void
-init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
+/* Set `invocation-name' `invocation-directory'.  */
+
+void
+set_invocation_vars (char *argv0, char const *original_pwd)
 {
-  int i;
-  Lisp_Object name, dir, handler;
-  ptrdiff_t count = SPECPDL_INDEX ();
-  Lisp_Object raw_name;
+  /* This function can be called from within pdumper or later during
+     boot.  No need to run it twice.  */
+  static bool double_run_guard;
+  if (double_run_guard)
+    return;
+  double_run_guard = true;
+
+  Lisp_Object raw_name, handler;
   AUTO_STRING (slash_colon, "/:");
 
-  initial_argv = argv;
-  initial_argc = argc;
-
 #ifdef WINDOWSNT
-  /* Must use argv[0] converted to UTF-8, as it begets many standard
+  /* Must use argv0 converted to UTF-8, as it begets many standard
      file and directory names.  */
   {
-    char argv0[MAX_UTF8_PATH];
+    char argv0_1[MAX_UTF8_PATH];
 
-    if (filename_from_ansi (argv[0], argv0) == 0)
-      raw_name = build_unibyte_string (argv0);
+    if (filename_from_ansi (argv0, argv0_1) == 0)
+      raw_name = build_unibyte_string (argv0_1);
     else
-      raw_name = build_unibyte_string (argv[0]);
+      raw_name = build_unibyte_string (argv0);
   }
 #else
-  raw_name = build_unibyte_string (argv[0]);
+  raw_name = build_unibyte_string (argv0);
 #endif
 
   /* Add /: to the front of the name
@@ -442,7 +443,7 @@ init_cmdargs (int argc, char **argv, int skip_args, char 
const *original_pwd)
   Vinvocation_name = Ffile_name_nondirectory (raw_name);
   Vinvocation_directory = Ffile_name_directory (raw_name);
 
-  /* If we got no directory in argv[0], search PATH to find where
+  /* If we got no directory in argv0, search PATH to find where
      Emacs actually came from.  */
   if (NILP (Vinvocation_directory))
     {
@@ -470,6 +471,21 @@ init_cmdargs (int argc, char **argv, int skip_args, char 
const *original_pwd)
 
       Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, odir);
     }
+}
+
+
+/* Code for dealing with Lisp access to the Unix command line.  */
+static void
+init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
+{
+  int i;
+  Lisp_Object name, dir;
+  ptrdiff_t count = SPECPDL_INDEX ();
+
+  initial_argv = argv;
+  initial_argc = argc;
+
+  set_invocation_vars (argv[0], original_pwd);
 
   Vinstallation_directory = Qnil;
 
@@ -758,7 +774,7 @@ load_pdump_find_executable (char const *argv0, ptrdiff_t 
*candidate_size)
 }
 
 static void
-load_pdump (int argc, char **argv)
+load_pdump (int argc, char **argv, char const *original_pwd)
 {
   const char *const suffix = ".pdmp";
   int result;
@@ -793,7 +809,7 @@ load_pdump (int argc, char **argv)
 
   if (dump_file)
     {
-      result = pdumper_load (dump_file);
+      result = pdumper_load (dump_file, argv[0], original_pwd);
 
       if (result != PDUMPER_LOAD_SUCCESS)
         fatal ("could not load dump file \"%s\": %s",
@@ -842,7 +858,7 @@ load_pdump (int argc, char **argv)
       if (bufsize < needed)
        dump_file = xpalloc (dump_file, &bufsize, needed - bufsize, -1, 1);
       strcpy (dump_file + exenamelen, suffix);
-      result = pdumper_load (dump_file);
+      result = pdumper_load (dump_file, argv[0], original_pwd);
       if (result == PDUMPER_LOAD_SUCCESS)
         goto out;
 
@@ -873,7 +889,7 @@ load_pdump (int argc, char **argv)
     }
   sprintf (dump_file, "%s%c%s%s",
            path_exec, DIRECTORY_SEP, argv0_base, suffix);
-  result = pdumper_load (dump_file);
+  result = pdumper_load (dump_file, argv[0], original_pwd);
 
   if (result == PDUMPER_LOAD_FILE_NOT_FOUND)
     {
@@ -908,7 +924,7 @@ load_pdump (int argc, char **argv)
 #endif
       sprintf (dump_file, "%s%c%s%s",
               path_exec, DIRECTORY_SEP, argv0_base, suffix);
-      result = pdumper_load (dump_file);
+      result = pdumper_load (dump_file, argv[0], original_pwd);
     }
 
   if (result != PDUMPER_LOAD_SUCCESS)
@@ -929,7 +945,6 @@ main (int argc, char **argv)
   /* Variable near the bottom of the stack, and aligned appropriately
      for pointers.  */
   void *stack_bottom_variable;
-
   bool no_loadup = false;
   char *junk = 0;
   char *dname_arg = 0;
@@ -1048,9 +1063,10 @@ main (int argc, char **argv)
   w32_init_main_thread ();
 #endif
 
+  emacs_wd = emacs_get_current_dir_name ();
 #ifdef HAVE_PDUMPER
   if (attempt_load_pdump)
-    load_pdump (argc, argv);
+    load_pdump (argc, argv, emacs_wd);
 #endif
 
   argc = maybe_disable_address_randomization (argc, argv);
@@ -1122,7 +1138,6 @@ main (int argc, char **argv)
       exit (0);
     }
 
-  emacs_wd = emacs_get_current_dir_name ();
 #ifdef HAVE_PDUMPER
   if (dumped_with_pdumper_p ())
     pdumper_record_wd (emacs_wd);
diff --git a/src/lisp.h b/src/lisp.h
index 9eccbd2..5456b9c 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4423,6 +4423,7 @@ extern bool display_arg;
 extern Lisp_Object decode_env_path (const char *, const char *, bool);
 extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
 extern AVOID terminate_due_to_signal (int, int);
+extern void set_invocation_vars (char *argv0, char const *original_pwd);
 #ifdef WINDOWSNT
 extern Lisp_Object Vlibrary_cache;
 #endif
diff --git a/src/pdumper.c b/src/pdumper.c
index 7fbacfe..69594b5 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -5428,7 +5428,7 @@ enum dump_section
    N.B. We run very early in initialization, so we can't use lisp,
    unwinding, xmalloc, and so on.  */
 int
-pdumper_load (const char *dump_filename)
+pdumper_load (const char *dump_filename, char *argv0, char const *original_pwd)
 {
   intptr_t dump_size;
   struct stat stat;
@@ -5574,6 +5574,9 @@ pdumper_load (const char *dump_filename)
   for (int i = 0; i < nr_dump_hooks; ++i)
     dump_hooks[i] ();
 
+  /* Once we can allocate and before loading .eln files we must set
+     Vinvocation_directory (.eln paths are relative to it). */
+  set_invocation_vars (argv0, original_pwd);
   dump_do_all_dump_reloc_for_phase (header, dump_base, LATE_RELOCS);
   dump_do_all_dump_reloc_for_phase (header, dump_base, VERY_LATE_RELOCS);
   initialized = true;
diff --git a/src/pdumper.h b/src/pdumper.h
index 6a99b51..b92958e 100644
--- a/src/pdumper.h
+++ b/src/pdumper.h
@@ -127,7 +127,8 @@ enum pdumper_load_result
     PDUMPER_LOAD_ERROR /* Must be last, as errno may be added.  */
   };
 
-int pdumper_load (const char *dump_filename);
+int pdumper_load (const char *dump_filename, char *argv0,
+                 char const *original_pwd);
 
 struct pdumper_loaded_dump
 {



reply via email to

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