cmake and jit
This commit is contained in:
19
C/absmi.c
19
C/absmi.c
@@ -532,6 +532,7 @@ Term Yap_XREGS[MaxTemps]; /* 29 */
|
||||
|
||||
#include "arith2.h"
|
||||
|
||||
|
||||
// #include "print_preg.h"
|
||||
//#include "sprint_op.hpp"
|
||||
//#include "print_op.hpp"
|
||||
@@ -540,11 +541,27 @@ Term Yap_XREGS[MaxTemps]; /* 29 */
|
||||
#include "IsGround.h"
|
||||
#include "yaam_macros.hpp"
|
||||
#include "fprintblock.h"
|
||||
#endif /* YAP_JIT */
|
||||
|
||||
#if YAP_DBG_PREDS
|
||||
#include "debug_printers.h"
|
||||
#endif
|
||||
|
||||
struct JIT_Compiler *J;
|
||||
|
||||
NativeContext *NativeArea;
|
||||
IntermediatecodeContext *IntermediatecodeArea;
|
||||
void shutdown_llvm(void);
|
||||
|
||||
CELL l;
|
||||
short global;
|
||||
CELL nnexec;
|
||||
yamop* HEADPREG;
|
||||
CELL BLOCK;
|
||||
CELL BLOCKADDRESS;
|
||||
CELL FAILED;
|
||||
|
||||
#endif /* YAP_JIT */
|
||||
|
||||
#ifdef COROUTINING
|
||||
/*
|
||||
Imagine we are interrupting the execution, say, because we have a spy
|
||||
|
@@ -329,12 +329,9 @@
|
||||
@file c_interface.c
|
||||
*/
|
||||
|
||||
#ifndef C_INTERFACE_C
|
||||
|
||||
#define Bool int
|
||||
#define flt double
|
||||
#define C_INTERFACE 1
|
||||
#define _yap_c_interface_h 1
|
||||
|
||||
#define C_INTERFACE_C 1
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "Yap.h"
|
||||
@@ -355,7 +352,6 @@
|
||||
// we cannot consult YapInterface.h, that conflicts with what we declare, though
|
||||
// it shouldn't
|
||||
#include "YapInterface.h"
|
||||
#define _yap_c_interface_h 1
|
||||
#include "pl-shared.h"
|
||||
#include "YapText.h"
|
||||
#include "pl-read.h"
|
||||
@@ -371,6 +367,9 @@
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
X_API int
|
||||
YAP_Reset(yap_reset_t mode);
|
||||
|
||||
#if !HAVE_STRNCPY
|
||||
#define strncpy(X,Y,Z) strcpy(X,Y)
|
||||
#endif
|
||||
@@ -490,33 +489,33 @@ doexpand(UInt sz)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
X_API Term
|
||||
X_API YAP_Term
|
||||
YAP_A(int i)
|
||||
{
|
||||
CACHE_REGS
|
||||
return(Deref(XREGS[i]));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
YAP_IsIntTerm(Term t)
|
||||
X_API YAP_Bool
|
||||
YAP_IsIntTerm(YAP_Term t)
|
||||
{
|
||||
return IsIntegerTerm(t);
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
YAP_IsNumberTerm(Term t)
|
||||
X_API YAP_Bool
|
||||
YAP_IsNumberTerm(YAP_Term t)
|
||||
{
|
||||
return IsIntegerTerm(t) || IsIntTerm(t) || IsFloatTerm(t) || IsBigIntTerm(t);
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
YAP_IsLongIntTerm(Term t)
|
||||
X_API YAP_Bool
|
||||
YAP_IsLongIntTerm(YAP_Term t)
|
||||
{
|
||||
return IsLongIntTerm(t);
|
||||
return IsLongIntTerm( t );
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
YAP_IsBigNumTerm(Term t)
|
||||
X_API YAP_Bool
|
||||
YAP_IsBigNumTerm(YAP_Term t)
|
||||
{
|
||||
#if USE_GMP
|
||||
CELL *pt;
|
||||
@@ -531,8 +530,8 @@ YAP_IsBigNumTerm(Term t)
|
||||
#endif
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
YAP_IsRationalTerm(Term t)
|
||||
X_API YAP_Bool
|
||||
YAP_IsRationalTerm(YAP_Term t)
|
||||
{
|
||||
#if USE_GMP
|
||||
CELL *pt;
|
||||
@@ -547,56 +546,55 @@ YAP_IsRationalTerm(Term t)
|
||||
#endif
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
YAP_IsVarTerm(Term t)
|
||||
X_API YAP_Bool
|
||||
YAP_IsVarTerm(YAP_Term t)
|
||||
{
|
||||
return (IsVarTerm(t));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
YAP_IsNonVarTerm(Term t)
|
||||
X_API YAP_Bool
|
||||
YAP_IsNonVarTerm(YAP_Term t)
|
||||
{
|
||||
return (IsNonVarTerm(t));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsFloatTerm(Term t)
|
||||
{
|
||||
return (IsFloatTerm(t));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsDbRefTerm(Term t)
|
||||
{
|
||||
return (IsDBRefTerm(t));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsAtomTerm(Term t)
|
||||
{
|
||||
return (IsAtomTerm(t));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsPairTerm(Term t)
|
||||
{
|
||||
return (IsPairTerm(t));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsApplTerm(Term t)
|
||||
{
|
||||
return (IsApplTerm(t) && !IsExtensionFunctor(FunctorOfTerm(t)));
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsCompoundTerm(Term t)
|
||||
{
|
||||
return (IsApplTerm(t) && !IsExtensionFunctor(FunctorOfTerm(t))) ||
|
||||
IsPairTerm(t);
|
||||
}
|
||||
|
||||
|
||||
X_API Term
|
||||
YAP_MkIntTerm(Int n)
|
||||
{
|
||||
@@ -633,7 +631,7 @@ YAP_MkBigNumTerm(void *big)
|
||||
#endif /* USE_GMP */
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API YAP_Bool
|
||||
YAP_BigNumOfTerm(Term t, void *b)
|
||||
{
|
||||
#if USE_GMP
|
||||
@@ -663,7 +661,7 @@ YAP_MkRationalTerm(void *big)
|
||||
#endif /* USE_GMP */
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API YAP_Bool
|
||||
YAP_RationalOfTerm(Term t, void *b)
|
||||
{
|
||||
#if USE_GMP
|
||||
@@ -733,8 +731,8 @@ YAP_MkFloatTerm(double n)
|
||||
return t;
|
||||
}
|
||||
|
||||
X_API flt
|
||||
YAP_FloatOfTerm(Term t)
|
||||
X_API YAP_Float
|
||||
YAP_FloatOfTerm(YAP_Term t)
|
||||
{
|
||||
return (FloatOfTerm(t));
|
||||
}
|
||||
@@ -755,7 +753,7 @@ YAP_AtomOfTerm(Term t)
|
||||
}
|
||||
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_IsWideAtom(Atom a)
|
||||
{
|
||||
return IsWideAtom(a);
|
||||
@@ -1129,7 +1127,7 @@ YAP_cut_up(void)
|
||||
RECOVER_B();
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_Unify(Term t1, Term t2)
|
||||
{
|
||||
Int out;
|
||||
@@ -2280,11 +2278,11 @@ run_emulator(YAP_dogoalinfo *dgi USES_REGS)
|
||||
return out;
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_EnterGoal(PredEntry *pe, Term *ptr, YAP_dogoalinfo *dgi)
|
||||
{
|
||||
CACHE_REGS
|
||||
int out;
|
||||
bool out;
|
||||
|
||||
BACKUP_MACHINE_REGS();
|
||||
LOCAL_PrologMode = UserMode;
|
||||
@@ -2307,12 +2305,12 @@ YAP_EnterGoal(PredEntry *pe, Term *ptr, YAP_dogoalinfo *dgi)
|
||||
return out;
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_RetryGoal(YAP_dogoalinfo *dgi)
|
||||
{
|
||||
CACHE_REGS
|
||||
choiceptr myB;
|
||||
int out;
|
||||
bool out;
|
||||
|
||||
BACKUP_MACHINE_REGS();
|
||||
myB = (choiceptr)(LCL0-dgi->b);
|
||||
@@ -2334,7 +2332,7 @@ YAP_RetryGoal(YAP_dogoalinfo *dgi)
|
||||
return out;
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_LeaveGoal(int backtrack, YAP_dogoalinfo *dgi)
|
||||
{
|
||||
CACHE_REGS
|
||||
@@ -2438,7 +2436,7 @@ YAP_AllocExternalDataInStack(size_t bytes)
|
||||
return t;
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsExternalDataInStackTerm(Term t)
|
||||
{
|
||||
return IsExternalBlobTerm(t, EXTERNAL_BLOB);
|
||||
@@ -2477,7 +2475,7 @@ Term YAP_NewOpaqueObject(YAP_opaque_tag_t tag, size_t bytes)
|
||||
return t;
|
||||
}
|
||||
|
||||
X_API Bool
|
||||
X_API YAP_Bool
|
||||
YAP_IsOpaqueObjectTerm(Term t, YAP_opaque_tag_t tag)
|
||||
{
|
||||
return IsExternalBlobTerm(t, (CELL)tag);
|
||||
@@ -2549,11 +2547,11 @@ YAP_RunGoalOnce(Term t)
|
||||
return out;
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_RestartGoal(void)
|
||||
{
|
||||
CACHE_REGS
|
||||
int out;
|
||||
bool out;
|
||||
BACKUP_MACHINE_REGS();
|
||||
if (LOCAL_AllowRestart) {
|
||||
P = (yamop *)FAILCODE;
|
||||
@@ -2572,7 +2570,7 @@ YAP_RestartGoal(void)
|
||||
return(out);
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_ShutdownGoal(int backtrack)
|
||||
{
|
||||
CACHE_REGS
|
||||
@@ -2616,11 +2614,11 @@ YAP_ShutdownGoal(int backtrack)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_ContinueGoal(void)
|
||||
{
|
||||
CACHE_REGS
|
||||
int out;
|
||||
bool out;
|
||||
BACKUP_MACHINE_REGS();
|
||||
|
||||
LOCAL_PrologMode = UserMode;
|
||||
@@ -2653,7 +2651,7 @@ YAP_PruneGoal(YAP_dogoalinfo *gi)
|
||||
RECOVER_B();
|
||||
}
|
||||
|
||||
X_API int
|
||||
X_API bool
|
||||
YAP_GoalHasException(Term *t)
|
||||
{
|
||||
CACHE_REGS
|
||||
@@ -4189,7 +4187,9 @@ YAP_IntToAtom(Int i)
|
||||
{
|
||||
return SWI_Atoms[i];
|
||||
}
|
||||
|
||||
|
||||
#endif // C_INTERFACE_C
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
||||
|
16
C/compiler.c
16
C/compiler.c
@@ -2181,6 +2181,22 @@ c_head(Term t, compiler_struct *cglobs)
|
||||
Yap_emit(native_op, 0, 0, &cglobs->cint);
|
||||
Yap_emit(ensure_space_op, Zero , Zero, &cglobs->cint);
|
||||
cglobs->space_op = cglobs->cint.cpc;
|
||||
#ifdef BEAM
|
||||
if (EAM) {
|
||||
Yap_emit(run_op,Zero,(UInt) cglobs->cint.CurrentPred,&cglobs->cint);
|
||||
}
|
||||
#endif
|
||||
if (Yap_ExecutionMode == MIXED_MODE || Yap_ExecutionMode == COMPILED)
|
||||
#if YAP_JIT
|
||||
Yap_emit(native_op, 0, 0, &cglobs->cint);
|
||||
#else
|
||||
{
|
||||
if (Yap_ExecutionMode == MIXED_MODE)
|
||||
Yap_NilError(NOJIT_ERROR, "mixed");
|
||||
else /* Yap_ExecutionMode == COMPILED */
|
||||
Yap_NilError(NOJIT_ERROR, "just compiled");
|
||||
}
|
||||
#endif
|
||||
c_args(t, 0, cglobs);
|
||||
}
|
||||
|
||||
|
@@ -76,13 +76,13 @@ Yap_PrintPredName( PredEntry *ap )
|
||||
int Yap_HandleError( const char *s, ... ) {
|
||||
CACHE_REGS
|
||||
yap_error_number err = LOCAL_Error_TYPE;
|
||||
char *serr;
|
||||
const char *serr;
|
||||
|
||||
LOCAL_Error_TYPE = YAP_NO_ERROR;
|
||||
if (LOCAL_ErrorMessage) {
|
||||
serr = LOCAL_ErrorMessage;
|
||||
} else {
|
||||
serr = (char *)s;
|
||||
serr = s;
|
||||
}
|
||||
switch (err) {
|
||||
case OUT_OF_STACK_ERROR:
|
||||
@@ -530,7 +530,7 @@ Yap_bug_location(yamop *pc)
|
||||
static char tmpbuf[YAP_BUF_SIZE];
|
||||
|
||||
yamop *
|
||||
Yap_NilError(yap_error_number type, char *format,...)
|
||||
Yap_NilError(yap_error_number type, const char *format,...)
|
||||
{
|
||||
va_list ap;
|
||||
yamop *res;
|
||||
@@ -544,7 +544,7 @@ Yap_NilError(yap_error_number type, char *format,...)
|
||||
}
|
||||
|
||||
yamop *
|
||||
Yap_Error(yap_error_number type, Term where, char *format,...)
|
||||
Yap_Error(yap_error_number type, Term where, const char *format,...)
|
||||
{
|
||||
CACHE_REGS
|
||||
va_list ap;
|
||||
|
3
C/init.c
3
C/init.c
@@ -936,7 +936,7 @@ static void
|
||||
InitStdPreds(void)
|
||||
{
|
||||
void initIO(void);
|
||||
|
||||
|
||||
Yap_InitCPreds();
|
||||
Yap_InitBackCPreds();
|
||||
BACKUP_MACHINE_REGS();
|
||||
@@ -1474,4 +1474,3 @@ Yap_exit (int value)
|
||||
closeFiles(TRUE);
|
||||
exit(value);
|
||||
}
|
||||
|
||||
|
@@ -77,9 +77,7 @@ p_load_foreign( USES_REGS1 )
|
||||
|
||||
/* get the initialization function name */
|
||||
t1 = Deref(ARG3);
|
||||
InitProcName = RepAtom(AtomOfTerm(t1))->StrOfAE;
|
||||
|
||||
|
||||
InitProcName = RepAtom(AtomOfTerm(t1))->StrOfAE;
|
||||
|
||||
/* call the OS specific function for dynamic loading */
|
||||
if(Yap_LoadForeign(ofiles,libs,InitProcName,&InitProc)==LOAD_SUCCEEDED) {
|
||||
|
69
C/stdpreds.c
69
C/stdpreds.c
@@ -283,6 +283,7 @@ static char SccsId[] = "%W% %G%";
|
||||
#include "eval.h"
|
||||
#include "yapio.h"
|
||||
#include "pl-shared.h"
|
||||
#include "Foreign.h"
|
||||
#ifdef TABLING
|
||||
#include "tab.macros.h"
|
||||
#endif /* TABLING */
|
||||
@@ -293,7 +294,11 @@ static char SccsId[] = "%W% %G%";
|
||||
#if HAVE_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#if YAP_JIT
|
||||
#include <JIT_Compiler.hpp>
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
static Int p_setval(USES_REGS1);
|
||||
static Int p_value(USES_REGS1);
|
||||
@@ -336,6 +341,25 @@ static Int p_access_yap_flags(USES_REGS1);
|
||||
static Int p_set_yap_flags(USES_REGS1);
|
||||
static Int p_break(USES_REGS1);
|
||||
|
||||
#if YAP_JIT
|
||||
void* (*Yap_JitCall)(struct JIT_Compiler* jc, yamop* p);
|
||||
void (* Yap_llvmShutdown)(void ) ;
|
||||
|
||||
Environment ExpEnv;
|
||||
|
||||
static Int p_jit(USES_REGS1) { /* '$set_value'(+Atom,+Atomic) */
|
||||
void *jit_handle;
|
||||
if ( (jit_handle = Yap_LoadForeignFile( YAP_YAPJITLIB, 0 ) ) ) {
|
||||
if (!Yap_CallForeignFile(jit_handle, "init_jit") )
|
||||
fprintf(stderr, "Could not load JIT\n" );
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#endif /* YAP_JIT */
|
||||
|
||||
#ifdef BEAM
|
||||
Int use_eam(USES_REGS1);
|
||||
Int eager_split(USES_REGS1);
|
||||
@@ -814,6 +838,38 @@ static Int
|
||||
return (FALSE);
|
||||
}
|
||||
out = IntegerOfTerm(t);
|
||||
#if YAP_JIT
|
||||
if (ExpEnv.analysis_struc.stats_enabled || ExpEnv.analysis_struc.time_pass_enabled) {
|
||||
if (strcmp(((char*)ExpEnv.analysis_struc.outfile), "STDERR")) {
|
||||
int stderrcopy = dup(2);
|
||||
if (strcmp(((char*)ExpEnv.analysis_struc.outfile), "STDOUT") == 0) {
|
||||
dup2(1, 2);
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
|
||||
shutdown_llvm();
|
||||
#pragma GCC diagnostic pop
|
||||
dup2(stderrcopy, 2);
|
||||
}
|
||||
else {
|
||||
int Outputfile = open(((char*)ExpEnv.analysis_struc.outfile), O_CREAT | O_APPEND | O_WRONLY, 0777);
|
||||
if (Outputfile < 0) {
|
||||
fprintf(stderr, "Error:: I can not write analysis passes's output on %s...\n", ((char*)ExpEnv.analysis_struc.outfile));
|
||||
fprintf(stderr, " %s...\n", strerror(errno));
|
||||
errno = 0;
|
||||
exit(1);
|
||||
}
|
||||
dup2(Outputfile, 2);
|
||||
shutdown_llvm();
|
||||
close(Outputfile);
|
||||
dup2(stderrcopy, 2);
|
||||
}
|
||||
close(stderrcopy);
|
||||
}
|
||||
else
|
||||
shutdown_llvm();
|
||||
}
|
||||
#endif
|
||||
|
||||
Yap_exit(out);
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1946,6 +2002,7 @@ static Int p_parallel_mode(USES_REGS1) { return FALSE; }
|
||||
static Int p_yapor_workers(USES_REGS1) { return FALSE; }
|
||||
#endif /* YAPOR */
|
||||
|
||||
|
||||
void Yap_InitCPreds(void) {
|
||||
/* numerical comparison */
|
||||
Yap_InitCPred("set_value", 2, p_setval, SafePredFlag | SyncPredFlag);
|
||||
@@ -2027,12 +2084,18 @@ void Yap_InitCPreds(void) {
|
||||
Yap_InitCPred("$set_flag", 4, p_set_flag, SyncPredFlag);
|
||||
Yap_InitCPred("$has_yap_or", 0, p_has_yap_or, SafePredFlag | SyncPredFlag);
|
||||
Yap_InitCPred("$has_eam", 0, p_has_eam, SafePredFlag | SyncPredFlag);
|
||||
#ifndef YAPOR
|
||||
#ifdef YAPOR
|
||||
Yap_InitCPred("parallel_mode", 1, p_parallel_mode,
|
||||
SafePredFlag | SyncPredFlag);
|
||||
Yap_InitCPred("$c_yapor_workers", 1, p_yapor_workers,
|
||||
SafePredFlag | SyncPredFlag);
|
||||
#endif /* YAPOR */
|
||||
#ifdef YAP_JIT
|
||||
Yap_InitCPred("init", 1, p_parallel_mode,
|
||||
SafePredFlag | SyncPredFlag);
|
||||
Yap_InitCPred("$c_yapor_workers", 1, p_yapor_workers,
|
||||
SafePredFlag | SyncPredFlag);
|
||||
#endif /* YAPOR */
|
||||
#ifdef INES
|
||||
Yap_InitCPred("euc_dist", 3, p_euc_dist, SafePredFlag);
|
||||
Yap_InitCPred("loop", 0, p_loop, SafePredFlag);
|
||||
@@ -2089,6 +2152,10 @@ void Yap_InitCPreds(void) {
|
||||
#if defined(YAPOR) || defined(TABLING)
|
||||
Yap_init_optyap_preds();
|
||||
#endif /* YAPOR || TABLING */
|
||||
#if YAP_JIT
|
||||
Yap_InitCPred("jit", 0, p_jit,
|
||||
SafePredFlag | SyncPredFlag);
|
||||
#endif
|
||||
Yap_InitThreadPreds();
|
||||
{
|
||||
void (*(*(p)))(void) = E_Modules;
|
||||
|
Reference in New Issue
Block a user