]> git.eshelyaron.com Git - emacs.git/commitdiff
* Add check_comp_unit_relocs
authorAndrea Corallo <akrl@sdf.org>
Wed, 13 May 2020 21:43:48 +0000 (22:43 +0100)
committerAndrea Corallo <akrl@sdf.org>
Fri, 15 May 2020 19:06:49 +0000 (20:06 +0100)
* src/comp.c (check_comp_unit_relocs): Add function to verify
relocation coherency.
(load_comp_unit): Call it.

src/comp.c

index d1f8fe23f0da53871886d6dae7cba6fbc8ea2189..dab102cccd91fb9ac3b8c3a0c364972b62792990 100644 (file)
@@ -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;
 }