From b6d6e7feb75b792c74fe3e1d036b9edf540d771e Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 24 Dec 2019 14:51:18 +0100 Subject: [PATCH] add native compilation unit pdumper support --- src/comp.c | 33 +++++++++++++++++++-------------- src/comp.h | 3 ++- src/pdumper.c | 16 ++++++++++++++++ 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/comp.c b/src/comp.c index 003d3d7ca44..43b22a86805 100644 --- a/src/comp.c +++ b/src/comp.c @@ -3217,7 +3217,7 @@ load_static_obj (dynlib_handle_ptr handle, const char *name) } void -load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u) +load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump) { dynlib_handle_ptr handle = comp_u->handle; struct thread_state ***current_thread_reloc = @@ -3237,22 +3237,26 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u) *current_thread_reloc = ¤t_thread; *pure_reloc = (EMACS_INT **)&pure; - /* Imported data. */ - Lisp_Object d_vec = load_static_obj (handle, TEXT_DATA_RELOC_SYM); - EMACS_INT d_vec_len = XFIXNUM (Flength (d_vec)); - - for (EMACS_INT i = 0; i < d_vec_len; i++) - data_relocs[i] = AREF (d_vec, i); - - comp_u->data_vec = d_vec; /* Imported functions. */ *freloc_link_table = freloc.link_table; - Lisp_Object comp_u_obj; - XSETNATIVE_COMP_UNIT (comp_u_obj, comp_u); + /* Imported data. */ + if (!loading_dump) + comp_u->data_vec = load_static_obj (handle, TEXT_DATA_RELOC_SYM); + + EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec)); + + for (EMACS_INT i = 0; i < d_vec_len; i++) + data_relocs[i] = AREF (comp_u->data_vec, i); - /* Executing this will perform all the expected environment modification. */ - top_level_run (comp_u_obj); + if (!loading_dump) + { + Lisp_Object comp_u_obj; + XSETNATIVE_COMP_UNIT (comp_u_obj, comp_u); + /* Executing this will perform all the expected environment + modification. */ + top_level_run (comp_u_obj); + } return; } @@ -3308,7 +3312,8 @@ DEFUN ("native-elisp-load", Fnative_elisp_load, Snative_elisp_load, 1, 1, 0, if (!comp_u->handle) xsignal2 (Qnative_lisp_load_failed, file, build_string (dynlib_error ())); comp_u->file = file; - load_comp_unit (comp_u); + comp_u->data_vec = Qnil; + load_comp_unit (comp_u, false); return Qt; } diff --git a/src/comp.h b/src/comp.h index c4849ba13d1..90b4f40426b 100644 --- a/src/comp.h +++ b/src/comp.h @@ -47,7 +47,8 @@ XNATIVE_COMP_UNIT (Lisp_Object a) } /* Defined in comp.c. */ -extern void load_comp_unit (struct Lisp_Native_Comp_Unit *); +extern void load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, + bool loading_dump); extern void syms_of_comp (void); /* Fill the freloc structure. Must be called before any eln is loaded. */ extern void fill_freloc (void); diff --git a/src/pdumper.c b/src/pdumper.c index 4e770f79af5..2dbe6c73fb4 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -197,6 +197,7 @@ enum dump_reloc_type /* dump_ptr = dump_ptr + dump_base */ RELOC_DUMP_TO_DUMP_PTR_RAW, /* dump_mpz = [rebuild bignum] */ + RELOC_NATIVE_COMP_UNIT, RELOC_BIGNUM, /* dump_lv = make_lisp_ptr (dump_lv + dump_base, type - RELOC_DUMP_TO_DUMP_LV) @@ -2991,6 +2992,11 @@ dump_native_comp_unit (struct dump_context *ctx, out->handle = NULL; dump_off comp_u_off = finish_dump_pvec (ctx, &out->header); + if (ctx->flags.dump_object_contents) + /* We'll do the real elf load during the LATE_RELOCS_1 relocation time. */ + dump_push (&ctx->dump_relocs[LATE_RELOCS_1], + list2 (make_fixnum (RELOC_NATIVE_COMP_UNIT), + dump_off_to_lisp (comp_u_off))); return comp_u_off; } #endif @@ -5290,6 +5296,16 @@ dump_do_dump_relocation (const uintptr_t dump_base, dump_write_word_to_dump (dump_base, reloc_offset, value); break; } + case RELOC_NATIVE_COMP_UNIT: + { + struct Lisp_Native_Comp_Unit *comp_u = + dump_ptr (dump_base, reloc_offset); + comp_u->handle = dynlib_open (SSDATA (comp_u->file)); + if (!comp_u->handle) + error ("%s", dynlib_error ()); + load_comp_unit (comp_u, true); + } + break; case RELOC_BIGNUM: { struct Lisp_Bignum *bignum = dump_ptr (dump_base, reloc_offset); -- 2.39.5