* Add check_comp_unit_relocs
* src/comp.c (check_comp_unit_relocs): Add function to verify relocation coherency. (load_comp_unit): Call it.
This commit is contained in:
parent
e351a12216
commit
ff9e40e9fe
1 changed files with 33 additions and 0 deletions
33
src/comp.c
33
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 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
|
void
|
||||||
load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
|
load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
|
||||||
bool late_load)
|
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;
|
data_ephemeral_vec = data_ephemeral_vec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eassert (check_comp_unit_relocs (comp_u));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue