diff options
Diffstat (limited to 'src/comp.h')
-rw-r--r-- | src/comp.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/comp.h b/src/comp.h new file mode 100644 index 00000000000..687e426b1ef --- /dev/null +++ b/src/comp.h @@ -0,0 +1,133 @@ +/* Elisp native compiler definitions +Copyright (C) 2019-2020 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ + +#ifndef COMP_H +#define COMP_H + +/* To keep ifdefs under control. */ +enum { + NATIVE_COMP_FLAG = +#ifdef HAVE_NATIVE_COMP + 1 +#else + 0 +#endif +}; + +#include <dynlib.h> + +struct Lisp_Native_Comp_Unit +{ + union vectorlike_header header; + /* Original eln file loaded. */ + Lisp_Object file; + Lisp_Object optimize_qualities; + /* Guard anonymous lambdas against Garbage Collection and serve + sanity checks. */ + Lisp_Object lambda_gc_guard_h; + /* Hash c_name -> d_reloc_imp index. */ + Lisp_Object lambda_c_name_idx_h; + /* Hash doc-idx -> function documentaiton. */ + Lisp_Object data_fdoc_v; + /* Analogous to the constant vector but per compilation unit. */ + Lisp_Object data_vec; + /* 'data_impure_vec' must be last (see allocate_native_comp_unit). + Same as data_vec but for data that cannot be moved to pure space. */ + Lisp_Object data_impure_vec; + /* STUFFS WE DO NOT DUMP!! */ + Lisp_Object *data_imp_relocs; + bool loaded_once; + bool load_ongoing; + dynlib_handle_ptr handle; +#ifdef WINDOWSNT + /* We need to store a copy of the original file name in memory that + is not subject to GC because the function to dispose native + compilation units is called by the GC. By that time the `file' + string may have been sweeped. */ + char *cfile; +#endif +} GCALIGNED_STRUCT; + +#ifdef HAVE_NATIVE_COMP + +INLINE bool +NATIVE_COMP_UNITP (Lisp_Object a) +{ + return PSEUDOVECTORP (a, PVEC_NATIVE_COMP_UNIT); +} + +INLINE struct Lisp_Native_Comp_Unit * +XNATIVE_COMP_UNIT (Lisp_Object a) +{ + eassert (NATIVE_COMP_UNITP (a)); + return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Native_Comp_Unit); +} + +/* Defined in comp.c. */ + +extern void hash_native_abi (void); + +extern void load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, + bool loading_dump, bool late_load); + +extern Lisp_Object native_function_doc (Lisp_Object function); + +extern void syms_of_comp (void); + +extern void maybe_defer_native_compilation (Lisp_Object function_name, + Lisp_Object definition); + +extern void dispose_comp_unit (struct Lisp_Native_Comp_Unit * comp_unit, + bool delay); + +extern void finish_delayed_disposal_of_comp_units (void); + +extern void dispose_all_remaining_comp_units (void); + +extern void clean_package_user_dir_of_old_comp_units (void); + +#else /* #ifdef HAVE_NATIVE_COMP */ + +static inline void +maybe_defer_native_compilation (Lisp_Object function_name, + Lisp_Object definition) +{} + +extern void syms_of_comp (void); + +static inline void +dispose_comp_unit (struct Lisp_Native_Comp_Unit * comp_handle, bool delay) +{ + eassert (false); +} + +static inline void +dispose_all_remaining_comp_units (void) +{} + +static inline void +clean_package_user_dir_of_old_comp_units (void) +{} + +static inline void +finish_delayed_disposal_of_comp_units (void) +{} + +#endif /* #ifdef HAVE_NATIVE_COMP */ + +#endif /* #ifndef COMP_H */ |