diff options
| author | Andrea Corallo | 2020-05-13 22:43:48 +0100 |
|---|---|---|
| committer | Andrea Corallo | 2020-05-15 20:06:49 +0100 |
| commit | ff9e40e9fefacfda9cce38d8884694b1c5207b1c (patch) | |
| tree | eb031bf489ab80c2da714b3c47bc7be8efbd9042 /src | |
| parent | e351a12216519d3ed09892752ce0b137f6672986 (diff) | |
| download | emacs-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.c | 33 |
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 | |||
| 3577 | static bool | ||
| 3578 | check_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 | |||
| 3575 | void | 3606 | void |
| 3576 | load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, | 3607 | load_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 | ||