/************************************************************************* * * * YAP Prolog %W% %G% * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: sshift.h * * Last rev: 19/2/88 * * mods: * * comments: stack shifter functionality for YAP * * * *************************************************************************/ #define CharP(ptr) ((char *) (ptr)) inline EXTERN int IsHeapP (CELL *); inline EXTERN int IsHeapP (CELL * ptr) { return (int) ((ptr >= (CELL *) Yap_HeapBase && ptr <= (CELL *) HeapTop)); } /* Adjusting cells and pointers to cells */ inline EXTERN CELL *PtoGloAdjust (CELL *); inline EXTERN CELL * PtoGloAdjust (CELL * ptr) { if (ptr < GSplit) { return (CELL *) (((CELL *) (CharP (ptr) + GDiff0))); } else { return (CELL *) (((CELL *) (CharP (ptr) + GDiff))); } } inline EXTERN CELL *PtoDelayAdjust (CELL *); inline EXTERN CELL * PtoDelayAdjust (CELL * ptr) { return (CELL *) (((CELL *) (CharP (ptr) + DelayDiff))); } inline EXTERN tr_fr_ptr PtoTRAdjust (tr_fr_ptr); inline EXTERN tr_fr_ptr PtoTRAdjust (tr_fr_ptr ptr) { return (tr_fr_ptr) (((tr_fr_ptr) (CharP (ptr) + TrDiff))); } inline EXTERN CELL *CellPtoTRAdjust (CELL *); inline EXTERN CELL * CellPtoTRAdjust (CELL * ptr) { return (CELL *) (((CELL *) (CharP (ptr) + TrDiff))); } inline EXTERN CELL *PtoLocAdjust (CELL *); inline EXTERN CELL * PtoLocAdjust (CELL * ptr) { return (CELL *) (((CELL *) (CharP (ptr) + LDiff))); } inline EXTERN choiceptr ChoicePtrAdjust (choiceptr); inline EXTERN choiceptr ChoicePtrAdjust (choiceptr ptr) { return (choiceptr) (((choiceptr) (CharP (ptr) + LDiff))); } #ifdef TABLING inline EXTERN choiceptr ConsumerChoicePtrAdjust (choiceptr); inline EXTERN choiceptr ConsumerChoicePtrAdjust (choiceptr ptr) { return (choiceptr) (((choiceptr) (CharP (ptr) + LDiff))); } inline EXTERN choiceptr GeneratorChoicePtrAdjust (choiceptr); inline EXTERN choiceptr GeneratorChoicePtrAdjust (choiceptr ptr) { return (choiceptr) (((choiceptr) (CharP (ptr) + LDiff))); } #endif /* TABLING */ inline EXTERN CELL GlobalAdjust (CELL); inline EXTERN CELL GlobalAdjust (CELL val) { if ((CELL *)val < GSplit) { return (CELL) ((val + GDiff0)); } else { return (CELL) ((val + GDiff)); } } inline EXTERN CELL DelayAdjust (CELL); inline EXTERN CELL DelayAdjust (CELL val) { return (CELL) ((val + DelayDiff)); } inline EXTERN ADDR GlobalAddrAdjust (ADDR); inline EXTERN ADDR GlobalAddrAdjust (ADDR ptr) { if ((CELL *)ptr < GSplit) { return (ADDR) ((ptr + GDiff0)); } else { return (ADDR) ((ptr + GDiff)); } } inline EXTERN ADDR DelayAddrAdjust (ADDR); inline EXTERN ADDR DelayAddrAdjust (ADDR ptr) { return (ADDR) ((ptr + DelayDiff)); } inline EXTERN CELL LocalAdjust (CELL); inline EXTERN CELL LocalAdjust (CELL val) { return (CELL) ((val + LDiff)); } inline EXTERN ADDR LocalAddrAdjust (ADDR); inline EXTERN ADDR LocalAddrAdjust (ADDR ptr) { return (ADDR) ((ptr + LDiff)); } inline EXTERN CELL TrailAdjust (CELL); inline EXTERN CELL TrailAdjust (CELL val) { return (CELL) ((val + TrDiff)); } inline EXTERN ADDR TrailAddrAdjust (ADDR); inline EXTERN ADDR TrailAddrAdjust (ADDR ptr) { return (ADDR) ((ptr + TrDiff)); } inline EXTERN TokEntry *TokEntryAdjust (TokEntry *); inline EXTERN TokEntry * TokEntryAdjust (TokEntry * ptr) { return (TokEntry *) (((CELL) ptr + TrDiff)); } inline EXTERN VarEntry *VarEntryAdjust (VarEntry *); inline EXTERN VarEntry * VarEntryAdjust (VarEntry * ptr) { return (VarEntry *) (((CELL) ptr + TrDiff)); } /* heap data structures */ inline EXTERN Functor FuncAdjust (Functor); inline EXTERN Functor FuncAdjust (Functor f) { if (!IsExtensionFunctor(f)) return (Functor) ((CharP (f) + HDiff)); return f; } inline EXTERN CELL *CellPtoHeapAdjust (CELL *); inline EXTERN CELL * CellPtoHeapAdjust (CELL * ptr) { return (CELL *) (((CELL *) (CharP (ptr) + HDiff))); } #if USE_OFFSETS inline EXTERN Atom AtomAdjust (Atom); inline EXTERN Atom AtomAdjust (Atom at) { return (Atom) ((at)); } inline EXTERN Prop PropAdjust (Prop); inline EXTERN Prop PropAdjust (Prop p) { return (Prop) ((p)); } #else inline EXTERN Atom AtomAdjust (Atom); inline EXTERN Atom AtomAdjust (Atom at) { return (Atom) ((at == NULL ? (at) : (Atom) (CharP (at) + HDiff))); } inline EXTERN Prop PropAdjust (Prop); inline EXTERN Prop PropAdjust (Prop p) { return (Prop) ((p == NULL ? (p) : (Prop) (CharP (p) + HDiff))); } #endif inline EXTERN PredEntry *PredEntryAdjust (PredEntry *); inline EXTERN PredEntry * PredEntryAdjust (PredEntry *p) { return (PredEntry *) ((p == NULL ? (p) : (PredEntry *) (CharP (p) + HDiff))); } inline EXTERN Term AtomTermAdjust (Term); inline EXTERN Term AtomTermAdjust (Term at) { return at + HDiff; } #if TAGS_FAST_OPS inline EXTERN Term BlobTermAdjust (Term); inline EXTERN Term BlobTermAdjust (Term t) { return (Term) ((t - HDiff)); } #else inline EXTERN Term BlobTermAdjust (Term); inline EXTERN Term BlobTermAdjust (Term t) { return (Term) ((t + HDiff)); } #endif inline EXTERN AtomEntry *AtomEntryAdjust (AtomEntry *); inline EXTERN AtomEntry * AtomEntryAdjust (AtomEntry * at) { return (AtomEntry *) ((AtomEntry *) (CharP (at) + HDiff)); } inline EXTERN GlobalEntry *GlobalEntryAdjust (GlobalEntry *); inline EXTERN GlobalEntry * GlobalEntryAdjust (GlobalEntry * at) { return (GlobalEntry *) ((GlobalEntry *) (CharP (at) + HDiff)); } inline EXTERN union CONSULT_OBJ *ConsultObjAdjust (union CONSULT_OBJ *); inline EXTERN union CONSULT_OBJ * ConsultObjAdjust (union CONSULT_OBJ *co) { return (union CONSULT_OBJ *) ((union CONSULT_OBJ *) (CharP (co) + HDiff)); } inline EXTERN DBRef DBRefAdjust (DBRef); inline EXTERN DBRef DBRefAdjust (DBRef dbr) { return (DBRef) ((DBRef) (CharP (dbr) + HDiff)); } inline EXTERN DBRef *DBRefPAdjust (DBRef *); inline EXTERN DBRef * DBRefPAdjust (DBRef * dbrp) { return (DBRef *) ((DBRef *) (CharP (dbrp) + HDiff)); } inline EXTERN DBTerm *DBTermAdjust (DBTerm *); inline EXTERN DBTerm * DBTermAdjust (DBTerm * dbtp) { return (DBTerm *) ((DBTerm *) (CharP (dbtp) + HDiff)); } inline EXTERN struct static_index *SIndexAdjust (struct static_index *); inline EXTERN struct static_index * SIndexAdjust (struct static_index *si) { return (struct static_index *) ((struct static_index *) (CharP (si) + HDiff)); } inline EXTERN struct logic_upd_index *LUIndexAdjust (struct logic_upd_index *); inline EXTERN struct logic_upd_index * LUIndexAdjust (struct logic_upd_index *lui) { return (struct logic_upd_index *) ((struct logic_upd_index *) (CharP (lui) + HDiff)); } inline EXTERN Term CodeAdjust (Term); inline EXTERN Term CodeAdjust (Term dbr) { return (Term) (((Term) (dbr) + HDiff)); } inline EXTERN ADDR AddrAdjust (ADDR); inline EXTERN ADDR AddrAdjust (ADDR addr) { return (ADDR) ((ADDR) (CharP (addr) + HDiff)); } inline EXTERN CODEADDR CodeAddrAdjust (CODEADDR); inline EXTERN CODEADDR CodeAddrAdjust (CODEADDR addr) { return (CODEADDR) ((CODEADDR) (CharP (addr) + HDiff)); } inline EXTERN char * CodeCharPAdjust (char *); inline EXTERN char * CodeCharPAdjust (char * addr) { return addr + HDiff; } inline EXTERN BlockHeader *BlockAdjust (BlockHeader *); inline EXTERN BlockHeader * BlockAdjust (BlockHeader * addr) { return (BlockHeader *) ((BlockHeader *) (CharP (addr) + HDiff)); } inline EXTERN yamop *PtoOpAdjust (yamop *); inline EXTERN yamop * PtoOpAdjust (yamop * ptr) { return (yamop *) (CharP (ptr) + HDiff); } inline EXTERN struct logic_upd_clause *PtoLUClauseAdjust (struct logic_upd_clause *); inline EXTERN struct logic_upd_clause * PtoLUClauseAdjust (struct logic_upd_clause * ptr) { return (struct logic_upd_clause *) (CharP (ptr) + HDiff); } inline EXTERN struct logic_upd_index *PtoLUIndexAdjust (struct logic_upd_index *); inline EXTERN struct logic_upd_index * PtoLUIndexAdjust (struct logic_upd_index * ptr) { return (struct logic_upd_index *) (CharP (ptr) + HDiff); } inline EXTERN CELL *PtoHeapCellAdjust (CELL *); inline EXTERN CELL * PtoHeapCellAdjust (CELL * ptr) { return (CELL *) (((CELL *) (CharP (ptr) + HDiff))); } inline EXTERN PredEntry *PtoPredAdjust (PredEntry *); inline EXTERN PredEntry * PtoPredAdjust (PredEntry * ptr) { return (PredEntry *) (((PredEntry *) (CharP (ptr) + HDiff))); } inline EXTERN ArrayEntry *PtoArrayEAdjust (ArrayEntry *); inline EXTERN ArrayEntry * PtoArrayEAdjust (ArrayEntry * ptr) { return (ArrayEntry *) (((ArrayEntry *) (CharP (ptr) + HDiff))); } inline EXTERN GlobalEntry *PtoGlobalEAdjust (GlobalEntry *); inline EXTERN GlobalEntry * PtoGlobalEAdjust (GlobalEntry * ptr) { return (GlobalEntry *) (((GlobalEntry *) (CharP (ptr) + HDiff))); } inline EXTERN StaticArrayEntry *PtoArraySAdjust (StaticArrayEntry *); inline EXTERN StaticArrayEntry * PtoArraySAdjust (StaticArrayEntry * ptr) { return (StaticArrayEntry *) (((StaticArrayEntry *) (CharP (ptr) + HDiff))); } inline EXTERN struct logic_upd_clause *PtoLUCAdjust (struct logic_upd_clause *); inline EXTERN struct logic_upd_clause * PtoLUCAdjust (struct logic_upd_clause *ptr) { return (struct logic_upd_clause *) (((struct logic_upd_clause *) (CharP (ptr) + HDiff))); } inline EXTERN struct static_clause *PtoStCAdjust (struct static_clause *); inline EXTERN struct static_clause * PtoStCAdjust (struct static_clause *ptr) { return (struct static_clause *) (((struct static_upd_clause *) (CharP (ptr) + HDiff))); } #if PRECOMPUTE_REGADDRESS inline EXTERN wamreg XAdjust (wamreg); inline EXTERN wamreg XAdjust (wamreg reg) { return (wamreg) ((wamreg) ((reg) + XDiff)); } #else inline EXTERN wamreg XAdjust (wamreg); inline EXTERN wamreg XAdjust (wamreg reg) { return (wamreg) ((reg)); } #endif inline EXTERN yslot YAdjust (yslot); inline EXTERN yslot YAdjust (yslot reg) { return (yslot) ((reg)); } inline EXTERN int IsOldLocal (CELL); inline EXTERN int IsOldLocal (CELL reg) { return (int) (IN_BETWEEN (OldASP, reg, OldLCL0)); } inline EXTERN int IsOldLocalPtr (CELL *); inline EXTERN int IsOldLocalPtr (CELL * ptr) { return (int) (IN_BETWEEN (OldASP, ptr, OldLCL0)); } /* require because the trail might contain dangling pointers */ inline EXTERN int IsOldLocalInTR (CELL); inline EXTERN int IsOldLocalInTR (CELL reg) { return (int) (IN_BETWEEN (OldH, reg, OldLCL0)); } inline EXTERN int IsOldLocalInTRPtr (CELL *); inline EXTERN int IsOldLocalInTRPtr (CELL * ptr) { return (int) (IN_BETWEEN (OldH, ptr, OldLCL0)); } inline EXTERN int IsOldH (CELL); inline EXTERN int IsOldH (CELL reg) { return (int) ((CharP (reg) == CharP (OldH))); } inline EXTERN int IsOldGlobal (CELL); inline EXTERN int IsOldGlobal (CELL reg) { return (int) (IN_BETWEEN (OldGlobalBase, reg, OldH)); } inline EXTERN int IsOldGlobalPtr (CELL *); inline EXTERN int IsOldGlobalPtr (CELL * ptr) { return (int) (IN_BETWEEN (OldGlobalBase, ptr, OldH)); } inline EXTERN int IsOldTrail (CELL); inline EXTERN int IsOldTrail (CELL reg) { return (int) (IN_BETWEEN (OldTrailBase, reg, OldTR)); } inline EXTERN int IsOldTrailPtr (CELL *); inline EXTERN int IsOldTrailPtr (CELL * ptr) { return (int) (IN_BETWEEN (OldTrailBase, ptr, OldTR)); } inline EXTERN int IsOldVarTableTrailPtr (struct VARSTRUCT *); inline EXTERN int IsOldVarTableTrailPtr (struct VARSTRUCT *ptr) { return (int) (IN_BETWEEN (OldTrailBase, ptr, OldTR)); } inline EXTERN int IsOldTokenTrailPtr (struct TOKEN *); inline EXTERN int IsOldTokenTrailPtr (struct TOKEN *ptr) { return (int) (IN_BETWEEN (OldTrailBase, ptr, OldTR)); } inline EXTERN int IsOldCode (CELL); inline EXTERN int IsOldCode (CELL reg) { return (int) (IN_BETWEEN (OldHeapBase, reg, OldHeapTop)); } inline EXTERN int IsOldCodeCellPtr (CELL *); inline EXTERN int IsOldCodeCellPtr (CELL * ptr) { return (int) (IN_BETWEEN (OldHeapBase, ptr, OldHeapTop)); } inline EXTERN int IsGlobal (CELL); inline EXTERN int IsGlobal (CELL reg) { return (int) (IN_BETWEEN (Yap_GlobalBase, reg, H)); } void STD_PROTO (Yap_AdjustStacksAndTrail, (void)); void STD_PROTO (Yap_AdjustRegs, (int));