From 98d2d24f46ce3e3d363122958f64567ee8babaad Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 18 Dec 2024 21:27:14 +0100 Subject: [PATCH] * Revert "Remove check_comp_unit_relocs" This reverts commit 81fc23b5d6a60ca4f3d269ab2c88eb9a850bac4c as the check is still useful but needs to be updated for the new reloc layout. * src/comp.c (check_comp_unit_relocs): Re-add. (load_comp_unit): Make use of. (cherry picked from commit 4e11f9c96df98dd3f10c1153bc49209f2383a0ee) --- src/comp.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/comp.c b/src/comp.c index 8b2446c3ef1..6f67d60cc26 100644 --- a/src/comp.c +++ b/src/comp.c @@ -5144,6 +5144,32 @@ load_static_obj (struct Lisp_Native_Comp_Unit *comp_u, const char *name) } +/* Return false when something is wrong or true otherwise. */ + +static bool +check_comp_unit_relocs (struct Lisp_Native_Comp_Unit *comp_u) +{ + dynlib_handle_ptr handle = comp_u->handle; + Lisp_Object *data_relocs = dynlib_sym (handle, DATA_RELOC_SYM); + + EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec)); + + for (ptrdiff_t i = 0; i < d_vec_len; i++) + { + Lisp_Object x = data_relocs[i]; + if (EQ (x, Qlambda_fixup)) + return false; + else if (NATIVE_COMP_FUNCTIONP (x)) + { + if (NILP (Fgethash (x, comp_u->lambda_gc_guard_h, Qnil))) + return false; + } + else if (!EQ (x, AREF (comp_u->data_vec, i))) + return false; + } + return true; +} + static void unset_cu_load_ongoing (Lisp_Object comp_u) { @@ -5273,6 +5299,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, /* Make sure data_ephemeral_vec still exists after top_level_run has run. Guard against sibling call optimization (or any other). */ data_ephemeral_vec = data_ephemeral_vec; + eassert (check_comp_unit_relocs (comp_u)); } if (!recursive_load) -- 2.39.5