19static char SccsId[] =
"%W% %G%";
22#define HAS_CACHE_REGS 1
43#include "tab.macros.h"
56#include <JIT_Compiler.hpp>
61extern int init_tries(
void);
64static Int p_setval(USES_REGS1);
65static Int p_value(USES_REGS1);
66static Int p_values(USES_REGS1);
68static CODEADDR *FindAtom(CODEADDR,
int *);
70static Int p_opdec(USES_REGS1);
71static Int p_univ(USES_REGS1);
72static Int p_abort(USES_REGS1);
74Int p_halt(USES_REGS1);
76static Int p_halt(USES_REGS1);
78static Int current_predicate(USES_REGS1);
79static Int cont_current_predicate(USES_REGS1);
81static Int init_current_op(USES_REGS1);
82static Int cont_current_op(USES_REGS1);
83static Int init_current_atom_op(USES_REGS1);
84static Int cont_current_atom_op(USES_REGS1);
85static Int TrailMax(
void);
86static Int GlobalMax(
void);
87static Int LocalMax(
void);
88static Int p_statistics_heap_max(USES_REGS1);
89static Int p_statistics_global_max(USES_REGS1);
90static Int p_statistics_local_max(USES_REGS1);
91static Int p_statistics_heap_info(USES_REGS1);
92static Int p_statistics_stacks_info(USES_REGS1);
93static Int p_statistics_trail_info(USES_REGS1);
94static Int p_cputime(USES_REGS1);
95static Int p_systime(USES_REGS1);
96static Int p_runtime(USES_REGS1);
97static Int p_walltime(USES_REGS1);
98static Int p_break(USES_REGS1);
101void *(*Yap_JitCall)(JIT_Compiler *jc,
yamop *p);
102void (*Yap_llvmShutdown)(void);
103Int (*Yap_traced_absmi)(void);
105static Int p_jit(USES_REGS1) {
108 if ((jit_handle = Yap_LoadForeignFile(YAP_YAPJITLIB, 0))) {
109 if (!Yap_CallForeignFile(jit_handle,
"init_jit"))
110 fprintf(stderr,
"Could not load JIT\n");
119Int use_eam(USES_REGS1);
120Int eager_split(USES_REGS1);
121Int force_wait(USES_REGS1);
122Int commit(USES_REGS1);
123Int skip_while_var(USES_REGS1);
124Int wait_while_var(USES_REGS1);
125Int show_time(USES_REGS1);
126Int start_eam(USES_REGS1);
127Int cont_eam(USES_REGS1);
131extern int showTime(
void);
133Int start_eam(USES_REGS1) {
142Int cont_eam(USES_REGS1) {
151Int use_eam(USES_REGS1) {
155 Yap_PutValue(AtomCArith, 0);
161Int commit(USES_REGS1) {
163 printf(
"Nao deveria ter sido chamado commit do stdpreds\n");
169Int skip_while_var(USES_REGS1) {
171 printf(
"Nao deveria ter sido chamado skip_while_var do stdpreds\n");
177Int wait_while_var(USES_REGS1) {
179 printf(
"Nao deveria ter sido chamado wait_while_var do stdpreds\n");
185Int force_wait(USES_REGS1) {
187 printf(
"Nao deveria ter sido chamado force_wait do stdpreds\n");
193Int eager_split(USES_REGS1) {
195 printf(
"Nao deveria ter sido chamado eager_split do stdpreds\n");
201Int show_time(USES_REGS1)
234static Int p_setval(USES_REGS1) {
235 Term t1 = Deref(ARG1), t2 = Deref(ARG2);
236 if (!IsVarTerm(t1) && IsAtomTerm(t1) &&
237 (!IsVarTerm(t2) && (IsAtomTerm(t2) || IsNumTerm(t2)))) {
238 Yap_PutValue(AtomOfTerm(t1), t2);
251static Int p_value(USES_REGS1) {
252 Term t1 = Deref(ARG1);
254 Yap_ThrowError(INSTANTIATION_ERROR, t1,
"get_value/2");
257 if (!IsAtomTerm(t1)) {
258 Yap_ThrowError(TYPE_ERROR_ATOM, t1,
"get_value/2");
261 return (Yap_unify_constant(ARG2, Yap_GetValue(AtomOfTerm(t1))));
264static Int p_values(USES_REGS1) {
265 Term t1 = Deref(ARG1), t3 = Deref(ARG3);
268 Yap_ThrowError(INSTANTIATION_ERROR, t1,
"set_value/2");
271 if (!IsAtomTerm(t1)) {
272 Yap_ThrowError(TYPE_ERROR_ATOM, t1,
"set_value/2");
275 if (!Yap_unify_constant(ARG2, Yap_GetValue(AtomOfTerm(t1)))) {
278 if (!IsVarTerm(t3)) {
279 if (IsAtomTerm(t3) || IsNumTerm(t3)) {
280 Yap_PutValue(AtomOfTerm(t1), t3);
289static Int p_opdec(USES_REGS1) {
291 Term p = Deref(ARG1), t = Deref(ARG2), at = Deref(ARG3);
292 Term tmod = Deref(ARG4);
293 if (tmod == TermProlog) {
294 tmod = PROLOG_MODULE;
296 return Yap_OpDec((
int)IntOfTerm(p), (
char *)RepAtom(AtomOfTerm(t))->StrOfAE,
297 AtomOfTerm(at), tmod);
306double strtod(s, pe)
char *s, **pe;
313 if (*s ==
'+' || *s ==
'-') {
319 while (isdigit(*s)) {
325 while (isdigit(*s)) {
328 if (*s ==
'e' || *s ==
'E') {
331 if (*s ==
'+' || *s ==
'-') {
334 while (isdigit(*s)) {
348#define INFINITY (1.0 / 0.0)
351static UInt runtime(USES_REGS1) {
352 return (Yap_cputime() - Yap_total_gc_time() - Yap_total_stack_shift_time());
356static Int p_runtime(USES_REGS1) {
357 Int now, interval, gc_time, ss_time;
358 Term tnow, tinterval;
360 Yap_cputime_interval(&now, &interval);
361 gc_time = Yap_total_gc_time();
363 ss_time = Yap_total_stack_shift_time();
365 interval -= (gc_time - LOCAL_LastGcTime) + (ss_time - LOCAL_LastSSTime);
366 LOCAL_LastGcTime = gc_time;
367 LOCAL_LastSSTime = ss_time;
368 tnow = MkIntegerTerm(now);
369 tinterval = MkIntegerTerm(interval);
370 return (Yap_unify_constant(ARG1, tnow) &&
371 Yap_unify_constant(ARG2, tinterval));
375static Int p_cputime(USES_REGS1) {
377 Yap_cputime_interval(&now, &interval);
378 return (Yap_unify_constant(ARG1, MkIntegerTerm(now)) &&
379 Yap_unify_constant(ARG2, MkIntegerTerm(interval)));
382static Int p_systime(USES_REGS1) {
384 Yap_systime_interval(&now, &interval);
385 return (Yap_unify_constant(ARG1, MkIntegerTerm(now)) &&
386 Yap_unify_constant(ARG2, MkIntegerTerm(interval)));
389static Int p_walltime(USES_REGS1) {
390 uint64_t now, interval;
391 uint64_t t = Yap_walltime();
392 now = t - Yap_StartOfWTimes;
393 interval = t - LOCAL_LastWTime;
394 return (Yap_unify_constant(ARG1, MkIntegerTerm(now / 1000)) &&
395 Yap_unify_constant(ARG2, MkIntegerTerm(interval / 1000)));
398static Int p_univ(USES_REGS1) {
406 if (IsVarTerm(tin)) {
410 Yap_ThrowError(INSTANTIATION_ERROR, t2,
"(=..)/2");
413 if (!IsPairTerm(t2)) {
415 Yap_ThrowError(DOMAIN_ERROR_NON_EMPTY_LIST, t2,
"(=..)/2");
417 Yap_ThrowError(TYPE_ERROR_LIST, ARG2,
"(=..)/2");
420 twork = HeadOfTerm(t2);
421 if (IsVarTerm(twork)) {
422 Yap_ThrowError(INSTANTIATION_ERROR, twork,
"(=..)/2");
425 if (IsNumTerm(twork)) {
426 Term tt = TailOfTerm(t2);
428 Yap_ThrowError(INSTANTIATION_ERROR, tt,
"(=..)/2");
431 if (tt != MkAtomTerm(AtomNil)) {
432 Yap_ThrowError(TYPE_ERROR_ATOMIC, twork,
"(=..)/2");
435 return (Yap_unify_constant(ARG1, twork));
437 if (!IsAtomTerm(twork)) {
438 Term tt = TailOfTerm(t2);
440 Yap_ThrowError(INSTANTIATION_ERROR, twork,
"(=..)/2");
442 }
else if (tt == MkAtomTerm(AtomNil)) {
443 Yap_ThrowError(TYPE_ERROR_ATOMIC, twork,
"(=..)/2");
446 Yap_ThrowError(TYPE_ERROR_ATOM, twork,
"(=..)/2");
450 at = AtomOfTerm(twork);
451 twork = TailOfTerm(t2);
452 if (IsVarTerm(twork)) {
453 Yap_ThrowError(INSTANTIATION_ERROR, twork,
"(=..)/2");
455 }
else if (!IsPairTerm(twork)) {
456 if (twork != TermNil) {
457 Yap_ThrowError(TYPE_ERROR_LIST, ARG2,
"(=..)/2");
460 return (Yap_unify_constant(ARG1, MkAtomTerm(at)));
467 while (!IsVarTerm(twork) && IsPairTerm(twork)) {
468 *HR++ = HeadOfTerm(twork);
469 if (HR > ASP - 1024) {
472 if (!Yap_dogc(PASS_REGS1)) {
473 Yap_ThrowError(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
476 twork = TailOfTerm(Deref(ARG2));
479 twork = TailOfTerm(twork);
481 if (IsVarTerm(twork)) {
482 Yap_ThrowError(INSTANTIATION_ERROR, twork,
"(=..)/2");
485 if (twork != TermNil) {
486 Yap_ThrowError(TYPE_ERROR_LIST, ARG2,
"(=..)/2");
492 SFEntry *pe = (SFEntry *)Yap_GetAProp(at, SFProperty);
494 twork = MkSFTerm(Yap_MkFunctor(at, SFArity), arity, CellPtr(TR),
497 twork = Yap_MkApplTerm(Yap_MkFunctor(at, arity), arity, CellPtr(TR));
501 if (at == AtomDot && arity == 2) {
507 *Ar = (CELL)(Yap_MkFunctor(at, arity));
511 return (Yap_unify(ARG1, twork));
513 if (IsAtomicTerm(tin)) {
514 twork = MkPairTerm(tin, MkAtomTerm(AtomNil));
515 return (Yap_unify(twork, ARG2));
519 if (IsApplTerm(tin)) {
520 Functor fun = FunctorOfTerm(tin);
521 if (IsExtensionFunctor(fun)) {
522 twork = MkPairTerm(tin, MkAtomTerm(AtomNil));
523 return (Yap_unify(twork, ARG2));
525 arity = ArityOfFunctor(fun);
526 at = NameOfFunctor(fun);
528 if (arity == SFArity) {
529 CELL *p = CellPtr(TR);
530 CELL *q = ArgsOfSFTerm(tin);
538 twork = Yap_ArrayToList(CellPtr(TR), argno - 1);
539 while (IsIntTerm(twork)) {
540 if (!Yap_gc(2, ENV, gc_P(P, CP))) {
541 Yap_ThrowError(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
544 twork = Yap_ArrayToList(CellPtr(TR), argno - 1);
549 while (HR + arity * 2 > ASP - 1024) {
550 if (!Yap_dogc(PASS_REGS1)) {
551 Yap_ThrowError(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
556 twork = Yap_ArrayToList(RepAppl(tin) + 1, arity);
561 twork = Yap_ArrayToList(RepPair(tin), 2);
563 twork = MkPairTerm(MkAtomTerm(at), twork);
564 return (Yap_unify(ARG2, twork));
567static Int p_abort(USES_REGS1) {
569 Yap_ThrowError(ABORT_EVENT, TermNil,
"");
574extern void exit_eam(
char *s);
581 Term t = Deref(ARG1);
586 exit_eam(
"\n\n[ Prolog execution halted ]\n");
590 Yap_ThrowError(INSTANTIATION_ERROR, t,
"halt/1");
593 if (!IsIntegerTerm(t)) {
594 Yap_ThrowError(TYPE_ERROR_INTEGER, t,
"halt/1");
597 out = IntegerOfTerm(t);
599 if (ExpEnv.analysis_struc.stats_enabled ||
600 ExpEnv.analysis_struc.time_pass_enabled) {
601 if (strcmp(((
char *)ExpEnv.analysis_struc.outfile),
"STDERR")) {
602 int stderrcopy = dup(2);
603 if (strcmp(((
char *)ExpEnv.analysis_struc.outfile),
"STDOUT") == 0) {
605#pragma GCC diagnostic push
606#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
608#pragma GCC diagnostic pop
611 int Outputfile = open(((
char *)ExpEnv.analysis_struc.outfile),
612 O_CREAT | O_APPEND | O_WRONLY, 0777);
613 if (Outputfile < 0) {
615 "Error:: I can not write analysis passes's output on %s...\n",
616 ((
char *)ExpEnv.analysis_struc.outfile));
617 fprintf(stderr,
" %s...\n", strerror(errno));
636static bool valid_prop(
Prop p, Term task) {
638 if ((pe->PredFlags & HiddenPredFlag) || (pe->OpcodeOfPred == UNDEF_OPCODE)) {
641 if (task == TermSystem || task == TermProlog) {
642 return pe->PredFlags & StandardPredFlag;
644 if (task == TermUser) {
645 return !(pe->PredFlags & StandardPredFlag);
647 if (IsVarTerm(task)) {
655 if (p->KindOfPE == PEProp && valid_prop(p, task)) {
668 if (p->KindOfPE == PEProp && valid_prop(p, task)) {
670 }
else if (p->KindOfPE == FunctorProperty) {
673 if ((pf = followLinkedListOfProps(RepFunctorProp(p)->PropsOfFE, task))) {
687 if (pe->ArityOfPE == 0 ||
688 (pe->PredFlags & (NumberDBPredFlag | AtomDBPredFlag))) {
690 return followLinkedListOfProps(p->NextOfPE, task);
695 if ((pf = followLinkedListOfProps(p->NextOfPE, task))) {
700 return getPredProp(f->NextOfPE, task);
704static Prop initFunctorSearch(Term t3, Term t2, Term task) {
705 if (IsAtomTerm(t3)) {
706 Atom at = AtomOfTerm(t3);
708 return followLinkedListOfProps(RepAtom(at)->PropsOfAE, task);
709 }
else if (IsIntTerm(t3)) {
710 if (IsNonVarTerm(t2) && t2 != IDB_MODULE) {
711 Yap_ThrowError(TYPE_ERROR_CALLABLE, t3,
"current_predicate/2");
717 p = AbsPredProp(Yap_FindLUIntKey(IntOfTerm(t3)));
718 if (valid_prop(p, task))
721 Yap_ThrowError(TYPE_ERROR_CALLABLE, t3,
"current_predicate/2");
725 if (IsPairTerm(t3)) {
728 f = FunctorOfTerm(t3);
729 if (IsExtensionFunctor(f)) {
730 Yap_ThrowError(TYPE_ERROR_CALLABLE, t3,
"current_predicate/2");
734 return followLinkedListOfProps(f->PropsOfFE, task);
742 npp = npp->NextPredOfModule;
743 }
while (npp && !valid_prop(AbsPredProp(npp), task));
749 while (npp && !valid_prop(AbsPredProp(npp), task))
750 npp = npp->NextPredOfModule;
762static Int cont_current_predicate(USES_REGS1) {
765 Term t1 = ARG1, t2 = Deref(ARG2), t3 = ARG3;
766 bool rc, will_cut =
false;
769 t1 = Yap_YapStripModule(t1, &t2);
770 t3 = Yap_YapStripModule(t3, &t2);
775 pp = AddressOfTerm(EXTRA_CBACK_ARG(4, 1));
776 if (IsNonVarTerm(t3)) {
779 if (IsNonVarTerm(t2)) {
781 if (IsAtomTerm(t3)) {
782 if ((p = Yap_GetPredPropByAtom(AtomOfTerm(t3), t2)) &&
783 valid_prop(p, task)) {
789 if ((p = Yap_GetPredPropByFunc(FunctorOfTerm(t3), t2)) &&
790 valid_prop(p, task)) {
804 p = initFunctorSearch(t3, t2, task);
810 np = followLinkedListOfProps(p->NextOfPE, task);
811 Term mod = pp->ModuleOfPred;
812 if (mod == PROLOG_MODULE)
814 bool b = Yap_unify(t2, mod);
821 EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(RepPredProp(np));
825 }
else if (IsNonVarTerm(t1)) {
834 p = AbsPredProp(Yap_FindLUIntKey(IntOfTerm(t3)));
835 }
else if (IsAtomTerm(t1)) {
837 Atom at = AtomOfTerm(t1);
838 p = getPredProp(RepAtom(at)->PropsOfAE, task);
840 Yap_ThrowError(TYPE_ERROR_CALLABLE, t1,
"current_predicate/2");
848 np = nextPredForAtom(p, task);
852 EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(RepPredProp(np));
855 }
else if (IsNonVarTerm(t2)) {
860 if (!IsAtomTerm(t2)) {
861 Yap_ThrowError(TYPE_ERROR_ATOM, t2,
"module name");
865 while (pp && !valid_prop(AbsPredProp(pp), task)) {
866 pp = pp->NextPredOfModule;
873 npp = firstModulePred(pp, task);
880 EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(npp);
889 pp = firstModulesPred(CurrentModules->PredForME, CurrentModules, task);
893 if (pp->ModuleOfPred == PROLOG_MODULE)
894 me = Yap_GetModuleEntry(TermProlog);
896 me = Yap_GetModuleEntry(pp->ModuleOfPred);
897 npp = firstModulesPred(pp->NextPredOfModule, me, task);
902 EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(npp);
907 if (pp->ModuleOfPred != IDB_MODULE) {
908 f = pp->FunctorOfPred;
909 Arity = pp->ArityOfPE;
911 name = MkAtomTerm(NameOfFunctor(f));
913 name = MkAtomTerm((
Atom)f);
915 if (pp->PredFlags & NumberDBPredFlag) {
916 name = MkIntegerTerm(pp->src.IndxId);
918 }
else if (pp->PredFlags & AtomDBPredFlag) {
919 f = pp->FunctorOfPred;
920 name = MkAtomTerm((
Atom)f);
923 f = pp->FunctorOfPred;
924 name = MkAtomTerm(NameOfFunctor(f));
925 Arity = ArityOfFunctor(pp->FunctorOfPred);
929 rc = Yap_unify(ARG3, Yap_MkNewApplTerm(f, Arity));
931 rc = Yap_unify(ARG3, name);
933 rc = rc && (IsAtomTerm(t2) || Yap_unify(ARG2, ModToTerm(pp->ModuleOfPred))) &&
934 Yap_unify(ARG1, name);
943static Int current_predicate(USES_REGS1) {
944 EXTRA_CBACK_ARG(4, 1) = MkAddressTerm(NULL);
946 return cont_current_predicate(PASS_REGS1);
951 while (!EndOfPAEntr(pp) &&
952 pp->KindOfPE != OpProperty &&
953 (RepOpProp(pp)->OpModule != PROLOG_MODULE || RepOpProp(pp)->OpModule != CurrentModule)
956 return RepOpProp(pp);
959int Yap_IsOp(
Atom at) {
961 OpEntry *op = NextOp(RepAtom(at)->PropsOfAE PASS_REGS);
962 return (!EndOfPAEntr(op));
965int Yap_IsOpMaxPrio(
Atom at) {
967 OpEntry *op = NextOp(RepAtom(at)->PropsOfAE PASS_REGS);
972 max = (op->Prefix & 0xfff);
973 if ((op->Infix & 0xfff) > max)
974 max = op->Infix & 0xfff;
975 if ((op->Posfix & 0xfff) > max)
976 max = op->Posfix & 0xfff;
980static Int unify_op(
OpEntry *op USES_REGS) {
981 Term tmod = op->OpModule;
983 if (tmod == PROLOG_MODULE)
985 return Yap_unify_constant(ARG2, tmod) &&
986 Yap_unify_constant(ARG3, MkIntegerTerm(op->Prefix)) &&
987 Yap_unify_constant(ARG4, MkIntegerTerm(op->Infix)) &&
988 Yap_unify_constant(ARG5, MkIntegerTerm(op->Posfix));
991static Int cont_current_op(USES_REGS1) {
992 OpEntry *op = (
OpEntry *)IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)), *next;
994 READ_LOCK(op->OpRWLock);
996 if (Yap_unify_constant(ARG1, MkAtomTerm(op->OpName)) &&
997 unify_op(op PASS_REGS)) {
998 READ_UNLOCK(op->OpRWLock);
1000 EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next);
1007 READ_UNLOCK(op->OpRWLock);
1009 EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next);
1018static Int init_current_op(
1020 EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)OpList);
1022 return cont_current_op(PASS_REGS1);
1025static Int cont_current_atom_op(USES_REGS1) {
1026 OpEntry *op = (
OpEntry *)IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)), *next;
1028 READ_LOCK(op->OpRWLock);
1029 next = NextOp(op->NextOfPE PASS_REGS);
1030 if (unify_op(op PASS_REGS)) {
1031 READ_UNLOCK(op->OpRWLock);
1033 EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next);
1040 READ_UNLOCK(op->OpRWLock);
1042 EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((CELL)next);
1051static Int init_current_atom_op(
1053 Term t = Deref(ARG1);
1057 if (IsVarTerm(t) || !IsAtomTerm(t)) {
1058 Yap_ThrowError(TYPE_ERROR_ATOM, t,
"current_op/3");
1061 ae = RepAtom(AtomOfTerm(t));
1062 if (EndOfPAEntr((ope = NextOp(ae->PropsOfAE PASS_REGS)))) {
1065 EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope);
1067 return cont_current_atom_op(PASS_REGS1);
1072 copy_local_ops(USES_REGS1) {
1073 Term tmodin = Deref(ARG1);
1074 Term t = Deref(ARG1);
1078 if (IsVarTerm(t) || !IsAtomTerm(t)) {
1079 Yap_ThrowError(TYPE_ERROR_ATOM, t,
"current_op/3");
1082 ae = RepAtom(AtomOfTerm(t));
1083 if (EndOfPAEntr((ope = NextOp(ae->PropsOfAE PASS_REGS)))) {
1086 EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope);
1088 return cont_current_atom_op(PASS_REGS1);
1092void Yap_show_statistics(
void) {
1094 unsigned long int heap_space_taken;
1097#if USE_SYSTEM_MALLOC && HAVE_MALLINFO
1098 struct mallinfo mi = mallinfo();
1100 heap_space_taken = (mi.arena + mi.hblkhd) - Yap_HoleSize;
1103 (
unsigned long int)(Unsigned(HeapTop) - Unsigned(Yap_HeapBase)) -
1106 frag = (100.0 * (heap_space_taken - HeapUsed)) / heap_space_taken;
1108 fprintf(stderr,
"Code Space: " UInt_FORMAT
" (" UInt_FORMAT
1109 " bytes needed, " UInt_FORMAT
" bytes used, "
1110 "fragmentation %.3f%%).\n",
1111 Unsigned(H0) - Unsigned(Yap_HeapBase),
1112 Unsigned(HeapTop) - Unsigned(Yap_HeapBase), Unsigned(HeapUsed), frag);
1113 fprintf(stderr,
"Stack Space: " UInt_FORMAT
" (" UInt_FORMAT
1114 " for Global, " UInt_FORMAT
" for local).\n",
1115 Unsigned(
sizeof(CELL) * (LCL0 - H0)),
1116 Unsigned(
sizeof(CELL) * (HR - H0)),
1117 Unsigned(
sizeof(CELL) * (LCL0 - ASP)));
1119 stderr,
"Trail Space: " UInt_FORMAT
" (" UInt_FORMAT
" used).\n",
1120 Unsigned(
sizeof(tr_fr_ptr) *
1121 (Unsigned(LOCAL_TrailTop) - Unsigned(LOCAL_TrailBase))),
1122 Unsigned(
sizeof(tr_fr_ptr) * (Unsigned(TR) - Unsigned(LOCAL_TrailBase))));
1123 fprintf(stderr,
"Runtime: " UInt_FORMAT
"\n", runtime(PASS_REGS1));
1124 fprintf(stderr,
"Cputime: " UInt_FORMAT
"\n", Yap_cputime());
1126 fprintf(stderr,
"Walltime: %" PRIu64
".\n", Yap_walltime() / (UInt)1000);
1129static Int p_statistics_heap_max(USES_REGS1) {
1130 Term tmax = MkIntegerTerm(HeapMax);
1132 return (Yap_unify(tmax, ARG1));
1139static Int TrailTide = -1, LocalTide = -1, GlobalTide = -1;
1142static Int TrailMax(
void) {
1145 Int TrWidth = Unsigned(LOCAL_TrailTop) - Unsigned(LOCAL_TrailBase);
1148 if (TrailTide != TrWidth) {
1150 while (pt + 2 < (CELL *)LOCAL_TrailTop) {
1151 if (pt[0] == 0 && pt[1] == 0 && pt[2] == 0)
1156 if (pt + 2 < (CELL *)LOCAL_TrailTop)
1157 i = Unsigned(pt) - Unsigned(LOCAL_TrailBase);
1169static Int p_statistics_trail_max(USES_REGS1) {
1170 Term tmax = MkIntegerTerm(TrailMax());
1172 return (Yap_unify(tmax, ARG1));
1176static Int GlobalMax(
void) {
1179 Int StkWidth = Unsigned(LCL0) - Unsigned(H0);
1182 if (GlobalTide != StkWidth) {
1184 while (pt + 2 < ASP) {
1185 if (pt[0] == 0 && pt[1] == 0 && pt[2] == 0)
1191 i = Unsigned(pt) - Unsigned(H0);
1194 GlobalTide = LocalTide = i = StkWidth;
1204static Int p_statistics_global_max(USES_REGS1) {
1205 Term tmax = MkIntegerTerm(GlobalMax());
1207 return (Yap_unify(tmax, ARG1));
1210static Int LocalMax(
void) {
1213 Int StkWidth = Unsigned(LCL0) - Unsigned(H0);
1216 if (LocalTide != StkWidth) {
1218 while (pt - 3 > HR) {
1219 if (pt[-1] == 0 && pt[-2] == 0 && pt[-3] == 0)
1225 i = Unsigned(LCL0) - Unsigned(pt);
1228 GlobalTide = LocalTide = i = StkWidth;
1238static Int p_statistics_local_max(USES_REGS1) {
1239 Term tmax = MkIntegerTerm(LocalMax());
1241 return (Yap_unify(tmax, ARG1));
1244static Int p_statistics_heap_info(USES_REGS1) {
1245 Term tusage = MkIntegerTerm(HeapUsed);
1247#if USE_SYSTEM_MALLOC && HAVE_MALLINFO
1248 struct mallinfo mi = mallinfo();
1250 UInt sstack = Yap_HoleSize + (LOCAL_TrailTop - LOCAL_GlobalBase);
1251 UInt mmax = (mi.arena + mi.hblkhd);
1252 Term tmax = MkIntegerTerm(mmax - sstack);
1253 tusage = MkIntegerTerm(mmax - (mi.fordblks + sstack));
1255 Term tmax = MkIntegerTerm((LOCAL_GlobalBase - Yap_HeapBase) - Yap_HoleSize);
1258 return (Yap_unify(tmax, ARG1) && Yap_unify(tusage, ARG2));
1261static Int p_statistics_stacks_info(USES_REGS1) {
1262 Term tmax = MkIntegerTerm(Unsigned(LCL0) - Unsigned(H0));
1263 Term tgusage = MkIntegerTerm(Unsigned(HR) - Unsigned(H0));
1264 Term tlusage = MkIntegerTerm(Unsigned(LCL0) - Unsigned(ASP));
1266 return (Yap_unify(tmax, ARG1) && Yap_unify(tgusage, ARG2) &&
1267 Yap_unify(tlusage, ARG3));
1270static Int p_statistics_trail_info(USES_REGS1) {
1272 MkIntegerTerm(Unsigned(LOCAL_TrailTop) - Unsigned(LOCAL_TrailBase));
1273 Term tusage = MkIntegerTerm(Unsigned(TR) - Unsigned(LOCAL_TrailBase));
1275 return (Yap_unify(tmax, ARG1) && Yap_unify(tusage, ARG2));
1278static Int p_statistics_atom_info(USES_REGS1) {
1279 UInt count = 0, spaceused = 0, i;
1281 for (i = 0; i < AtomHashTableSize; i++) {
1284 READ_LOCK(HashChain[i].AERWLock);
1285 catom = HashChain[i].Entry;
1287 READ_LOCK(RepAtom(catom)->ARWLock);
1289 READ_UNLOCK(HashChain[i].AERWLock);
1290 while (catom != NIL) {
1294 sizeof(
AtomEntry) + strlen((
char *)RepAtom(catom)->StrOfAE) + 1;
1295 ncatom = RepAtom(catom)->NextOfAE;
1296 if (ncatom != NIL) {
1297 READ_LOCK(RepAtom(ncatom)->ARWLock);
1299 READ_UNLOCK(RepAtom(catom)->ARWLock);
1303 for (i = 0; i < WideAtomHashTableSize; i++) {
1306 READ_LOCK(WideHashChain[i].AERWLock);
1307 catom = WideHashChain[i].Entry;
1309 READ_LOCK(RepAtom(catom)->ARWLock);
1311 READ_UNLOCK(WideHashChain[i].AERWLock);
1312 while (catom != NIL) {
1317 sizeof(
wchar_t) * (wcslen((
wchar_t *)(RepAtom(catom)->StrOfAE) + 1));
1318 ncatom = RepAtom(catom)->NextOfAE;
1319 if (ncatom != NIL) {
1320 READ_LOCK(RepAtom(ncatom)->ARWLock);
1322 READ_UNLOCK(RepAtom(catom)->ARWLock);
1326 return Yap_unify(ARG1, MkIntegerTerm(count)) &&
1327 Yap_unify(ARG2, MkIntegerTerm(spaceused));
1330static Int p_statistics_db_size(USES_REGS1) {
1331 Term t = MkIntegerTerm(Yap_ClauseSpace);
1332 Term tit = MkIntegerTerm(Yap_IndexSpace_Tree);
1333 Term tis = MkIntegerTerm(Yap_IndexSpace_SW);
1334 Term tie = MkIntegerTerm(Yap_IndexSpace_EXT);
1336 return Yap_unify(t, ARG1) && Yap_unify(tit, ARG2) && Yap_unify(tis, ARG3) &&
1337 Yap_unify(tie, ARG4);
1340static Int p_statistics_lu_db_size(USES_REGS1) {
1341 Term t = MkIntegerTerm(Yap_LUClauseSpace);
1342 Term tit = MkIntegerTerm(Yap_LUIndexSpace_Tree);
1343 Term tic = MkIntegerTerm(Yap_LUIndexSpace_CP);
1344 Term tix = MkIntegerTerm(Yap_LUIndexSpace_EXT);
1345 Term tis = MkIntegerTerm(Yap_LUIndexSpace_SW);
1347 return Yap_unify(t, ARG1) && Yap_unify(tit, ARG2) && Yap_unify(tic, ARG3) &&
1348 Yap_unify(tis, ARG4) && Yap_unify(tix, ARG5);
1351static Int p_executable(USES_REGS1) {
1352 int lvl = push_text_stack();
1356 if (!tmp || tmp[0] ==
'\0' ) {
1357 tmp =
Malloc(MAX_PATH + 1);
1358 strncpy((
char *)tmp, Yap_FindExecutable(), MAX_PATH);
1360 Atom at = Yap_LookupAtom(tmp);
1361 pop_text_stack(lvl);
1362 return Yap_unify(MkAtomTerm(at), ARG1);
1365static Int p_system_mode(USES_REGS1) {
1366 Term t1 = Deref(ARG1);
1368 if (IsVarTerm(t1)) {
1369 if (LOCAL_PrologMode & SystemMode)
1370 return Yap_unify(t1, MkAtomTerm(AtomTrue));
1372 return Yap_unify(t1, MkAtomTerm(AtomFalse));
1374 Atom at = AtomOfTerm(t1);
1375 if (at == AtomFalse)
1376 LOCAL_PrologMode &= ~SystemMode;
1378 LOCAL_PrologMode |= SystemMode;
1383static Int p_lock_system(USES_REGS1) {
1388static Int p_unlock_system(USES_REGS1) {
1393static Int enter_undefp(USES_REGS1) {
1394 if (LOCAL_DoingUndefp) {
1397 LOCAL_DoingUndefp = TRUE;
1401static Int exit_undefp(USES_REGS1) {
1402 if (LOCAL_DoingUndefp) {
1403 LOCAL_DoingUndefp = FALSE;
1410extern void DumpActiveGoals(
void);
1412static Int p_dump_active_goals(USES_REGS1) {
1419static Int p_euc_dist(USES_REGS1) {
1420 Term t1 = Deref(ARG1);
1421 Term t2 = Deref(ARG2);
1422 double d1 = (double)(IntegerOfTerm(ArgOfTerm(1, t1)) -
1423 IntegerOfTerm(ArgOfTerm(1, t2)));
1424 double d2 = (double)(IntegerOfTerm(ArgOfTerm(2, t1)) -
1425 IntegerOfTerm(ArgOfTerm(2, t2)));
1426 double d3 = (double)(IntegerOfTerm(ArgOfTerm(3, t1)) -
1427 IntegerOfTerm(ArgOfTerm(3, t2)));
1428 Int result = (Int)sqrt(d1 * d1 + d2 * d2 + d3 * d3);
1429 return (Yap_unify(ARG3, MkIntegerTerm(result)));
1432volatile int loop_counter = 0;
1434static Int p_loop(USES_REGS1) {
1435 while (loop_counter == 0)
1441static Int p_break(USES_REGS1) {
1442 Atom at = AtomOfTerm(Deref(ARG1));
1443 if (at == AtomTrue) {
1447 if (at == AtomFalse) {
1454void Yap_InitBackCPreds(
void) {
1455 Yap_InitCPredBack(
"$current_predicate", 4, 1, current_predicate,
1456 cont_current_predicate, SafePredFlag | SyncPredFlag);
1457 Yap_InitCPredBack(
"$current_op", 5, 1, init_current_op, cont_current_op,
1458 SafePredFlag | SyncPredFlag);
1459 Yap_InitCPredBack(
"$current_atom_op", 5, 1, init_current_atom_op,
1460 cont_current_atom_op, SafePredFlag | SyncPredFlag);
1462 Yap_InitCPredBack(
"eam", 1, 0, start_eam, cont_eam, SafePredFlag);
1465 Yap_InitBackAtoms();
1468 Yap_InitUserBacks();
1471typedef void (*Proc)(void);
1473Proc E_Modules[] = { (Proc)0};
1476static Int p_parallel_mode(USES_REGS1) {
return FALSE; }
1478static Int p_yapor_workers(USES_REGS1) {
return FALSE; }
1483 Yap_InitCPred(
"set_value", 2, p_setval, SafePredFlag | SyncPredFlag);
1484 Yap_InitCPred(
"get_value", 2, p_value,
1485 TestPredFlag | SafePredFlag | SyncPredFlag);
1486 Yap_InitCPred(
"$values", 3, p_values, SafePredFlag | SyncPredFlag);
1488 Yap_InitCPred(
"opdec", 4, p_opdec, SafePredFlag | SyncPredFlag);
1489 Yap_InitCPred(
"=..", 2, p_univ, 0);
1500 Yap_InitCPred(
"$statistics_trail_max", 1, p_statistics_trail_max,
1501 SafePredFlag | SyncPredFlag);
1502 Yap_InitCPred(
"$statistics_heap_max", 1, p_statistics_heap_max,
1503 SafePredFlag | SyncPredFlag);
1504 Yap_InitCPred(
"$statistics_global_max", 1, p_statistics_global_max,
1505 SafePredFlag | SyncPredFlag);
1506 Yap_InitCPred(
"$statistics_local_max", 1, p_statistics_local_max,
1507 SafePredFlag | SyncPredFlag);
1508 Yap_InitCPred(
"$statistics_heap_info", 2, p_statistics_heap_info,
1509 SafePredFlag | SyncPredFlag);
1510 Yap_InitCPred(
"$statistics_stacks_info", 3, p_statistics_stacks_info,
1511 SafePredFlag | SyncPredFlag);
1512 Yap_InitCPred(
"$statistics_trail_info", 2, p_statistics_trail_info,
1513 SafePredFlag | SyncPredFlag);
1514 Yap_InitCPred(
"$statistics_atom_info", 2, p_statistics_atom_info,
1515 SafePredFlag | SyncPredFlag);
1516 Yap_InitCPred(
"$statistics_db_size", 4, p_statistics_db_size,
1517 SafePredFlag | SyncPredFlag);
1518 Yap_InitCPred(
"$statistics_lu_db_size", 5, p_statistics_lu_db_size,
1519 SafePredFlag | SyncPredFlag);
1520 Yap_InitCPred(
"$executable", 1, p_executable, SafePredFlag);
1521 Yap_InitCPred(
"$runtime", 2, p_runtime, SafePredFlag | SyncPredFlag);
1522 Yap_InitCPred(
"$cputime", 2, p_cputime, SafePredFlag | SyncPredFlag);
1523 Yap_InitCPred(
"$systime", 2, p_systime, SafePredFlag | SyncPredFlag);
1524 Yap_InitCPred(
"$walltime", 2, p_walltime, SafePredFlag | SyncPredFlag);
1525 Yap_InitCPred(
"$system_mode", 1, p_system_mode, SafePredFlag | SyncPredFlag);
1526 Yap_InitCPred(
"abort", 0, p_abort, SyncPredFlag);
1537 Yap_InitCPred(
"$break", 1, p_break, SafePredFlag);
1539 Yap_InitCPred(
"@", 0, eager_split, SafePredFlag);
1540 Yap_InitCPred(
":", 0, force_wait, SafePredFlag);
1541 Yap_InitCPred(
"/", 0, commit, SafePredFlag);
1542 Yap_InitCPred(
"skip_while_var", 1, skip_while_var, SafePredFlag);
1543 Yap_InitCPred(
"wait_while_var", 1, wait_while_var, SafePredFlag);
1544 Yap_InitCPred(
"eamtime", 0, show_time, SafePredFlag);
1545 Yap_InitCPred(
"eam", 0, use_eam, SafePredFlag);
1547 Yap_InitCPred(
"$halt", 1, p_halt, SyncPredFlag);
1548 Yap_InitCPred(
"$lock_system", 0, p_lock_system, SafePredFlag);
1549 Yap_InitCPred(
"$unlock_system", 0, p_unlock_system, SafePredFlag);
1550 Yap_InitCPred(
"$enter_undefp", 0, enter_undefp, SafePredFlag);
1551 Yap_InitCPred(
"$exit_undefp", 0, exit_undefp, SafePredFlag);
1554 Yap_InitCPred(
"$jit_init", 1, p_jit, SafePredFlag | SyncPredFlag);
1557 Yap_InitCPred(
"euc_dist", 3, p_euc_dist, SafePredFlag);
1558 Yap_InitCPred(
"loop", 0, p_loop, SafePredFlag);
1561 Yap_InitCPred(
"in_range", 8, p_in_range, TestPredFlag | SafePredFlag);
1562 Yap_InitCPred(
"in_range", 4, p_in_range2, TestPredFlag | SafePredFlag);
1565 Yap_InitCPred(
"dump_active_goals", 0, p_dump_active_goals,
1566 SafePredFlag | SyncPredFlag);
1569 Yap_InitArrayPreds();
1570 Yap_InitAtomPreds();
1576 Yap_InitCoroutPreds();
1578 Yap_InitErrorPreds();
1584 Yap_InitLoadForeign();
1586 Yap_InitSavePreds();
1594 Yap_udi_Interval_init();
1595 Yap_InitSignalCPreds();
1596 Yap_InitUserCPreds();
1597 Yap_InitUtilCPreds();
1598 Yap_InitTermCPreds();
1599 Yap_InitSortPreds();
1600 Yap_InitMaVarCPreds();
1602 Yap_InitItDeepenPreds();
1605 Yap_InitAnalystPreds();
1607 Yap_InitLowLevelTrace();
1609 Yap_InitGrowPreds();
1611#if defined(YAPOR) || defined(TABLING)
1612 Yap_init_optyap_preds();
1615 Yap_InitCPred(
"jit", 0, p_jit, SafePredFlag | SyncPredFlag);
1617 Yap_InitThreadPreds();
1619 void (*(*(p)))(void) = E_Modules;
1628 extern void InitForeignPreds(
void);
1630 Yap_InitForeignPreds();
1635 extern void init_ol(
void), init_time(
void);
load_foreign_files/3 has works for the following configurations:
const char * Yap_AbsoluteFile(const char *spec, bool ok)
generate absolute path, if ok first expand SICStus Prolog style
void * Malloc(size_t sz USES_REGS)
allocate a temporary text block
Module property: low-level data used to manage modes.