summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Corallo <akrl@sdf.org>2020-05-13 22:43:48 +0100
committerAndrea Corallo <akrl@sdf.org>2020-05-15 20:06:49 +0100
commitff9e40e9fefacfda9cce38d8884694b1c5207b1c (patch)
treeeb031bf489ab80c2da714b3c47bc7be8efbd9042
parente351a12216519d3ed09892752ce0b137f6672986 (diff)
downloademacs-ff9e40e9fefacfda9cce38d8884694b1c5207b1c.tar.gz
emacs-ff9e40e9fefacfda9cce38d8884694b1c5207b1c.tar.bz2
emacs-ff9e40e9fefacfda9cce38d8884694b1c5207b1c.zip
* Add check_comp_unit_relocs
* src/comp.c (check_comp_unit_relocs): Add function to verify relocation coherency. (load_comp_unit): Call it.
-rw-r--r--src/comp.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/comp.c b/src/comp.c
index d1f8fe23f0d..dab102cccd9 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -3572,6 +3572,37 @@ load_static_obj (struct Lisp_Native_Comp_Unit *comp_u, const char *name)
return Fread (make_string (res->data, res->len));
}
+/* 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);
+ Lisp_Object *data_imp_relocs = dynlib_sym (handle, DATA_RELOC_IMPURE_SYM);
+
+ EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec));
+ for (EMACS_INT i = 0; i < d_vec_len; i++)
+ if (!EQ (data_relocs[i], AREF (comp_u->data_vec, i)))
+ return false;
+
+ d_vec_len = XFIXNUM (Flength (comp_u->data_impure_vec));
+ for (EMACS_INT i = 0; i < d_vec_len; i++)
+ {
+ Lisp_Object x = data_imp_relocs[i];
+ if (EQ (x, Qlambda_fixup))
+ return false;
+ else if (SUBR_NATIVE_COMPILEDP (x))
+ {
+ if (NILP (Fgethash (x, comp_u->lambda_gc_guard, Qnil)))
+ return false;
+ }
+ else if (!EQ (data_imp_relocs[i], AREF (comp_u->data_impure_vec, i)))
+ return false;
+ }
+ return true;
+}
+
void
load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
bool late_load)
@@ -3691,6 +3722,8 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
data_ephemeral_vec = data_ephemeral_vec;
}
+ eassert (check_comp_unit_relocs (comp_u));
+
return;
}