Unstaged modified lisp/emacs-lisp/comp.el @@ -68,7 +68,7 @@ native-comp-speed :safe #'integerp :version "28.1") -(defcustom native-comp-debug 0 +(defcustom native-comp-debug 2 "Debug level for native compilation, a number between 0 and 3. This is intended for debugging the compiler itself. 0 no debug output. modified src/comp.c @@ -5322,6 +5322,32 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, Lisp_Object comp_u_lisp_obj; XSETNATIVE_COMP_UNIT (comp_u_lisp_obj, comp_u); +# ifdef HAVE_MPS + { + comp_u->comp_unit = dynlib_sym (handle, COMP_UNIT_SYM); + comp_u->data_relocs = dynlib_sym (handle, DATA_RELOC_SYM); + comp_u->data_imp_relocs = dynlib_sym (handle, DATA_RELOC_IMPURE_SYM); + comp_u->data_eph_relocs = dynlib_sym (handle, DATA_RELOC_EPHEMERAL_SYM); + Lisp_Object *f_symbols_with_pos_enabled_reloc + = dynlib_sym (handle, F_SYMBOLS_WITH_POS_ENABLED_RELOC_SYM); + + comp_u->n_data_relocs = comp_u->data_eph_relocs - comp_u->data_relocs; + comp_u->n_data_eph_relocs = comp_u->data_imp_relocs - comp_u->data_eph_relocs; + comp_u->n_data_imp_relocs = f_symbols_with_pos_enabled_reloc - comp_u->data_imp_relocs; + + comp_u->comp_unit_root = igc_root_create_n (comp_u->comp_unit, 1); + if (comp_u->n_data_relocs) + comp_u->data_relocs_root + = igc_root_create_n (comp_u->data_relocs, comp_u->n_data_relocs); + if (comp_u->n_data_eph_relocs) + comp_u->data_eph_relocs_root + = igc_root_create_n (comp_u->data_eph_relocs, comp_u->n_data_eph_relocs); + if (comp_u->n_data_imp_relocs) + comp_u->data_imp_relocs_root + = igc_root_create_n (comp_u->data_imp_relocs, comp_u->n_data_imp_relocs); + } +#endif + Lisp_Object *saved_cu = dynlib_sym (handle, COMP_UNIT_SYM); if (!saved_cu) xsignal1 (Qnative_lisp_file_inconsistent, comp_u->file); @@ -5366,11 +5392,6 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, /* Always set data_imp_relocs pointer in the compilation unit (in can be used in 'dump_do_dump_relocation'). */ comp_u->data_imp_relocs = dynlib_sym (handle, DATA_RELOC_IMPURE_SYM); -#ifdef HAVE_MPS - comp_u->data_relocs = dynlib_sym (handle, DATA_RELOC_SYM); - comp_u->comp_unit = dynlib_sym (handle, COMP_UNIT_SYM); - comp_u->comp_unit_root = igc_root_create_n (saved_cu, 1); -#endif if (!comp_u->loaded_once) { @@ -5418,19 +5439,14 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec)); #ifdef HAVE_MPS - comp_u->n_data_relocs = d_vec_len; - if (d_vec_len > 0) - comp_u->data_relocs_root = igc_root_create_n (data_relocs, d_vec_len); + eassert (comp_u->n_data_relocs == d_vec_len); #endif for (EMACS_INT i = 0; i < d_vec_len; i++) data_relocs[i] = AREF (comp_u->data_vec, i); d_vec_len = XFIXNUM (Flength (comp_u->data_impure_vec)); #ifdef HAVE_MPS - comp_u->n_data_imp_relocs = d_vec_len; - if (d_vec_len > 0) - comp_u->data_imp_relocs_root - = igc_root_create_n (data_imp_relocs, d_vec_len); + eassert (comp_u->n_data_imp_relocs == d_vec_len); #endif for (EMACS_INT i = 0; i < d_vec_len; i++) data_imp_relocs[i] = AREF (comp_u->data_impure_vec, i); @@ -5461,11 +5477,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, # ifdef HAVE_MPS /* FIXME: If we want to get rid of these objects, stop tracing these references at some point. */ - comp_u->data_eph_relocs = data_eph_relocs; - comp_u->n_data_eph_relocs = d_vec_len; - if (d_vec_len > 0) - comp_u->data_eph_relocs_root - = igc_root_create_n (data_eph_relocs, d_vec_len); + eassert (comp_u->n_data_eph_relocs = d_vec_len); # endif for (EMACS_INT i = 0; i < d_vec_len; i++) data_eph_relocs[i] = AREF (data_ephemeral_vec, i);