cmake and jit

This commit is contained in:
Vítor Santos Costa
2015-01-26 04:02:46 +00:00
parent 9d4b59f7d6
commit bc1e70758e
49 changed files with 1397 additions and 1311 deletions

View File

@@ -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

View File

@@ -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
/**
@}
*/

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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;