]> git.eshelyaron.com Git - emacs.git/commitdiff
add pure addr relocation mechanism
authorAndrea Corallo <akrl@sdf.org>
Sun, 10 Nov 2019 08:26:17 +0000 (09:26 +0100)
committerAndrea Corallo <akrl@sdf.org>
Wed, 1 Jan 2020 10:38:02 +0000 (11:38 +0100)
src/comp.c

index 04a63c1aec505bbf37b0c85ab8ddf6a3d4215b7f..80a59faa859ebfc5064ee2f874b1bbb9bdc73419 100644 (file)
@@ -39,6 +39,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* C symbols emited for the load relocation mechanism.  */
 #define CURRENT_THREAD_RELOC_SYM "current_thread_reloc"
+#define PURE_RELOC_SYM "pure_reloc"
 #define DATA_RELOC_SYM "d_reloc"
 #define IMPORTED_FUNC_RELOC_SYM "f_reloc"
 #define TEXT_DATA_RELOC_SYM "text_data_reloc"
@@ -119,7 +120,7 @@ typedef struct {
   gcc_jit_type *thread_state_ptr_type;
   gcc_jit_rvalue *current_thread_ref;
   /* other globals */
-  gcc_jit_rvalue *pure;
+  gcc_jit_rvalue *pure_ref;
   /* libgccjit has really limited support for casting therefore this union will
      be used for the scope.  */
   gcc_jit_type *cast_union_type;
@@ -1000,7 +1001,9 @@ emit_PURE_P (gcc_jit_rvalue *ptr)
        GCC_JIT_BINARY_OP_MINUS,
        comp.uintptr_type,
        emit_cast (comp.uintptr_type, ptr),
-       emit_cast (comp.uintptr_type, comp.pure)),
+       emit_cast (comp.uintptr_type,
+                  gcc_jit_lvalue_as_rvalue (
+                    gcc_jit_rvalue_dereference (comp.pure_ref, NULL)))),
       gcc_jit_context_new_rvalue_from_int (comp.ctxt,
                                           comp.uintptr_type,
                                           PURESIZE));
@@ -1737,6 +1740,15 @@ emit_ctxt_code (void)
         gcc_jit_type_get_pointer (comp.thread_state_ptr_type),
         CURRENT_THREAD_RELOC_SYM));
 
+  comp.pure_ref =
+    gcc_jit_lvalue_as_rvalue (
+      gcc_jit_context_new_global (
+        comp.ctxt,
+        NULL,
+        GCC_JIT_GLOBAL_EXPORTED,
+        gcc_jit_type_get_pointer (comp.void_ptr_type),
+        PURE_RELOC_SYM));
+
   declare_runtime_imported_data ();
   /* Imported objects.  */
   EMACS_UINT d_reloc_len =
@@ -2998,11 +3010,6 @@ DEFUN ("comp--init-ctxt", Fcomp__init_ctxt, Scomp__init_ctxt,
   define_thread_state_struct ();
   define_cast_union ();
 
-  /* FIXME!!  */
-  comp.pure =
-    gcc_jit_context_new_rvalue_from_ptr (comp.ctxt,
-                                        comp.void_ptr_type,
-                                        pure);
   return Qt;
 }
 
@@ -3170,6 +3177,10 @@ load_comp_unit (dynlib_handle_ptr handle)
     dynlib_sym (handle, CURRENT_THREAD_RELOC_SYM);
   *current_thread_reloc = &current_thread;
 
+  EMACS_INT ***pure_reloc =
+    dynlib_sym (handle, PURE_RELOC_SYM);
+  *pure_reloc = (EMACS_INT **)&pure;
+
   /* Imported data.  */
   Lisp_Object *data_relocs = dynlib_sym (handle, DATA_RELOC_SYM);