(comp-emit-block 'entry)
(comp-emit-annotation (concat "Lisp function: "
(symbol-name (comp-func-symbol-name func))))
+ (comp-emit `(const-vector ,(concat (comp-func-c-func-name func) "_data_relocs")
+ ,(prin1-to-string (aref (comp-func-byte-func func)
+ 2))))
(if (comp-args-p args)
(cl-loop for i below (comp-args-max args)
do (cl-incf (comp-sp))
;; Once we have the final LIMPLE we jump into C.
(comp-init-ctxt)
(comp-add-func-to-ctxt func)
- (comp-compile-and-load-ctxt)
+ (comp-compile-ctxt-to-file (symbol-name func-symbol-name))
+ ;; (comp-compile-and-load-ctxt)
(comp-release-ctxt)))
(error "Trying to native compile something not a function")))
/* Ex: (comment "Function: foo"). */
emit_comment((char *) SDATA (arg0));
}
+ else if (EQ (op, Qconst_vector))
+ {
+ /* Ex: (const-vector "F666f6f_foo_reloc"
+ "[a b c 1 2]"). */
+ Lisp_Object vec = SECOND (args);
+ EMACS_INT v_len = XFIXNUM (FUNCALL1 (length, vec));
+
+ gcc_jit_context_new_global (
+ comp.ctxt,
+ NULL,
+ GCC_JIT_GLOBAL_INTERNAL,
+ gcc_jit_context_new_array_type (comp.ctxt,
+ NULL,
+ comp.lisp_obj_type,
+ v_len),
+ (char *) SDATA (arg0));
+ }
else if (EQ (op, Qreturn))
{
gcc_jit_block_end_with_return (comp.block,
NULL,
emit_mvar_val (arg0));
}
+ else
+ {
+ error ("LIMPLE op inconsistent");
+ }
}
\f
doc: /* Compile as native code the current context to file. */)
(Lisp_Object ctxtname)
{
- if (!STRINGP (ctxtname))
- error ("Argument ctxtname not a string");
+ CHECK_STRING (ctxtname);
gcc_jit_context_set_int_option (comp.ctxt,
GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL,
{
/* Limple instruction set. */
DEFSYM (Qcomment, "comment");
+ DEFSYM (Qconst_vector, "const-vector");
DEFSYM (Qjump, "jump");
DEFSYM (Qcall, "call");
DEFSYM (Qcallref, "callref");