aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrea Corallo2020-05-13 22:43:48 +0100
committerAndrea Corallo2020-05-15 20:06:49 +0100
commitff9e40e9fefacfda9cce38d8884694b1c5207b1c (patch)
treeeb031bf489ab80c2da714b3c47bc7be8efbd9042 /src
parente351a12216519d3ed09892752ce0b137f6672986 (diff)
downloademacs-ff9e40e9fefacfda9cce38d8884694b1c5207b1c.tar.gz
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.
Diffstat (limited to 'src')
-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)
3572 return Fread (make_string (res->data, res->len)); 3572 return Fread (make_string (res->data, res->len));
3573} 3573}
3574 3574
3575/* Return false when something is wrong or true otherwise. */
3576
3577static bool
3578check_comp_unit_relocs (struct Lisp_Native_Comp_Unit *comp_u)
3579{
3580 dynlib_handle_ptr handle = comp_u->handle;
3581 Lisp_Object *data_relocs = dynlib_sym (handle, DATA_RELOC_SYM);
3582 Lisp_Object *data_imp_relocs = dynlib_sym (handle, DATA_RELOC_IMPURE_SYM);
3583
3584 EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec));
3585 for (EMACS_INT i = 0; i < d_vec_len; i++)
3586 if (!EQ (data_relocs[i], AREF (comp_u->data_vec, i)))
3587 return false;
3588
3589 d_vec_len = XFIXNUM (Flength (comp_u->data_impure_vec));
3590 for (EMACS_INT i = 0; i < d_vec_len; i++)
3591 {
3592 Lisp_Object x = data_imp_relocs[i];
3593 if (EQ (x, Qlambda_fixup))
3594 return false;
3595 else if (SUBR_NATIVE_COMPILEDP (x))
3596 {
3597 if (NILP (Fgethash (x, comp_u->lambda_gc_guard, Qnil)))
3598 return false;
3599 }
3600 else if (!EQ (data_imp_relocs[i], AREF (comp_u->data_impure_vec, i)))
3601 return false;
3602 }
3603 return true;
3604}
3605
3575void 3606void
3576load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, 3607load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
3577 bool late_load) 3608 bool late_load)
@@ -3691,6 +3722,8 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
3691 data_ephemeral_vec = data_ephemeral_vec; 3722 data_ephemeral_vec = data_ephemeral_vec;
3692 } 3723 }
3693 3724
3725 eassert (check_comp_unit_relocs (comp_u));
3726
3694 return; 3727 return;
3695} 3728}
3696 3729