1
2
3
4
5
6
7
8 /*************************************************************************
9 * *
10 * YAP Prolog %W% %G%
11 * *
12 * Yap Prolog was developed at NCCUP - Universidade do Porto *
13 * *
14 * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
15 * *
16 **************************************************************************
17 * *
18 * File: sshift.h *
19 * Last rev: 19/2/88 *
20 * mods: *
21 * comments: stack shifter functionality for YAP *
22 * *
23 *************************************************************************/
24
25
26 /* The difference between the old stack pointers and the new ones */
27 extern Int HDiff,
28 GDiff,
29 LDiff,
30 TrDiff,
31 XDiff,
32 DelayDiff;
33
34 /* The old stack pointers */
35 extern CELL *OldASP, *OldLCL0;
36 extern tr_fr_ptr OldTR;
37 extern CELL *OldGlobalBase, *OldH, *OldH0;
38 extern ADDR OldTrailBase, OldTrailTop;
39 extern ADDR OldHeapBase, OldHeapTop;
40
41 #define CharP(ptr) ((char *) (ptr))
42
43
44 inline EXTERN int IsHeapP(CELL *);
45
IsHeapP(CELL * ptr)46 inline EXTERN int IsHeapP(CELL * ptr)
47 {
48 return (int) ((ptr >= (CELL *)HeapBase && ptr <= (CELL *)HeapTop) );
49 }
50
51
52
53 /* Adjusting cells and pointers to cells */
54
55 inline EXTERN CELL * PtoGloAdjust(CELL *);
56
PtoGloAdjust(CELL * ptr)57 inline EXTERN CELL * PtoGloAdjust(CELL * ptr)
58 {
59 return (CELL *) (((CELL *)(CharP(ptr) + GDiff)) );
60 }
61
62
63
64 inline EXTERN CELL * PtoDelayAdjust(CELL *);
65
PtoDelayAdjust(CELL * ptr)66 inline EXTERN CELL * PtoDelayAdjust(CELL * ptr)
67 {
68 return (CELL *) (((CELL *)(CharP(ptr) + DelayDiff)) );
69 }
70
71
72
73 inline EXTERN tr_fr_ptr PtoTRAdjust(tr_fr_ptr);
74
PtoTRAdjust(tr_fr_ptr ptr)75 inline EXTERN tr_fr_ptr PtoTRAdjust(tr_fr_ptr ptr)
76 {
77 return (tr_fr_ptr) (((tr_fr_ptr)(CharP(ptr) + TrDiff)) );
78 }
79
80
81
82 inline EXTERN CELL * CellPtoTRAdjust(CELL *);
83
CellPtoTRAdjust(CELL * ptr)84 inline EXTERN CELL * CellPtoTRAdjust(CELL * ptr)
85 {
86 return (CELL *) (((CELL *)(CharP(ptr) + TrDiff)) );
87 }
88
89
90
91 inline EXTERN CELL * PtoLocAdjust(CELL *);
92
PtoLocAdjust(CELL * ptr)93 inline EXTERN CELL * PtoLocAdjust(CELL * ptr)
94 {
95 return (CELL *) (((CELL *)(CharP(ptr) + LDiff)) );
96 }
97
98
99
100 inline EXTERN choiceptr ChoicePtrAdjust(choiceptr);
101
ChoicePtrAdjust(choiceptr ptr)102 inline EXTERN choiceptr ChoicePtrAdjust(choiceptr ptr)
103 {
104 return (choiceptr) (((choiceptr)(CharP(ptr) + LDiff)) );
105 }
106
107
108 #ifdef TABLING
109
110 inline EXTERN choiceptr ConsumerChoicePtrAdjust(choiceptr);
111
ConsumerChoicePtrAdjust(choiceptr ptr)112 inline EXTERN choiceptr ConsumerChoicePtrAdjust(choiceptr ptr)
113 {
114 return (choiceptr) (((choiceptr)(CharP(ptr) + LDiff)) );
115 }
116
117
118
119 inline EXTERN choiceptr GeneratorChoicePtrAdjust(choiceptr);
120
GeneratorChoicePtrAdjust(choiceptr ptr)121 inline EXTERN choiceptr GeneratorChoicePtrAdjust(choiceptr ptr)
122 {
123 return (choiceptr) (((choiceptr)(CharP(ptr) + LDiff)) );
124 }
125
126
127 #endif /* TABLING */
128
129
130 inline EXTERN CELL GlobalAdjust(CELL);
131
GlobalAdjust(CELL val)132 inline EXTERN CELL GlobalAdjust(CELL val)
133 {
134 return (CELL) ((val+GDiff) );
135 }
136
137
138
139 inline EXTERN CELL DelayAdjust(CELL);
140
DelayAdjust(CELL val)141 inline EXTERN CELL DelayAdjust(CELL val)
142 {
143 return (CELL) ((val+DelayDiff) );
144 }
145
146
147
148 inline EXTERN ADDR GlobalAddrAdjust(ADDR);
149
GlobalAddrAdjust(ADDR ptr)150 inline EXTERN ADDR GlobalAddrAdjust(ADDR ptr)
151 {
152 return (ADDR) ((ptr+GDiff) );
153 }
154
155
156
157 inline EXTERN ADDR DelayAddrAdjust(ADDR);
158
DelayAddrAdjust(ADDR ptr)159 inline EXTERN ADDR DelayAddrAdjust(ADDR ptr)
160 {
161 return (ADDR) ((ptr+DelayDiff) );
162 }
163
164
165
166 inline EXTERN CELL LocalAdjust(CELL);
167
LocalAdjust(CELL val)168 inline EXTERN CELL LocalAdjust(CELL val)
169 {
170 return (CELL) ((val+LDiff) );
171 }
172
173
174
175 inline EXTERN ADDR LocalAddrAdjust(ADDR);
176
LocalAddrAdjust(ADDR ptr)177 inline EXTERN ADDR LocalAddrAdjust(ADDR ptr)
178 {
179 return (ADDR) ((ptr+LDiff) );
180 }
181
182
183
184 inline EXTERN CELL TrailAdjust(CELL);
185
TrailAdjust(CELL val)186 inline EXTERN CELL TrailAdjust(CELL val)
187 {
188 return (CELL) ((val+TrDiff) );
189 }
190
191
192
193 inline EXTERN ADDR TrailAddrAdjust(ADDR);
194
TrailAddrAdjust(ADDR ptr)195 inline EXTERN ADDR TrailAddrAdjust(ADDR ptr)
196 {
197 return (ADDR) ((ptr+TrDiff) );
198 }
199
200
201 /* heap data structures */
202
203 inline EXTERN Functor FuncAdjust(Functor);
204
FuncAdjust(Functor f)205 inline EXTERN Functor FuncAdjust(Functor f)
206 {
207 return (Functor) ((Functor)(CharP(f)+HDiff) );
208 }
209
210
211
212 inline EXTERN CELL * CellPtoHeapAdjust(CELL *);
213
CellPtoHeapAdjust(CELL * ptr)214 inline EXTERN CELL * CellPtoHeapAdjust(CELL * ptr)
215 {
216 return (CELL *) (((CELL *)(CharP(ptr) + HDiff)) );
217 }
218
219
220 #if USE_OFFSETS
221
222 inline EXTERN Atom AtomAdjust(Atom);
223
AtomAdjust(Atom at)224 inline EXTERN Atom AtomAdjust(Atom at)
225 {
226 return (Atom) ((at) );
227 }
228
229
230
231 inline EXTERN Prop PropAdjust(Prop);
232
PropAdjust(Prop p)233 inline EXTERN Prop PropAdjust(Prop p)
234 {
235 return (Prop) ((p) );
236 }
237
238
239 #else
240
241 inline EXTERN Atom AtomAdjust(Atom);
242
AtomAdjust(Atom at)243 inline EXTERN Atom AtomAdjust(Atom at)
244 {
245 return (Atom) ((at == NULL ? (at) : (Atom)(CharP(at)+HDiff) ));
246 }
247
248
249
250 inline EXTERN Prop PropAdjust(Prop);
251
PropAdjust(Prop p)252 inline EXTERN Prop PropAdjust(Prop p)
253 {
254 return (Prop) ((p == NULL ? (p) : (Prop)(CharP(p)+HDiff)) );
255 }
256
257
258 #endif
259
260 inline EXTERN Term AtomTermAdjust(Term);
261
AtomTermAdjust(Term at)262 inline EXTERN Term AtomTermAdjust(Term at)
263 {
264 return (Term) ((at) );
265 }
266
267
268 #if TAGS_FAST_OPS
269
270 inline EXTERN Term BlobTermAdjust(Term);
271
BlobTermAdjust(Term t)272 inline EXTERN Term BlobTermAdjust(Term t)
273 {
274 return (Term) ((t-HDiff) );
275 }
276
277
278 #else
279
280 inline EXTERN Term BlobTermAdjust(Term);
281
BlobTermAdjust(Term t)282 inline EXTERN Term BlobTermAdjust(Term t)
283 {
284 return (Term) ((t+HDiff) );
285 }
286
287
288 #endif
289
290 inline EXTERN AtomEntry * AtomEntryAdjust(AtomEntry *);
291
AtomEntryAdjust(AtomEntry * at)292 inline EXTERN AtomEntry * AtomEntryAdjust(AtomEntry * at)
293 {
294 return (AtomEntry *) ((AtomEntry *)(CharP(at)+HDiff) );
295 }
296
297
298
299 inline EXTERN union CONSULT_OBJ * ConsultObjAdjust(union CONSULT_OBJ *);
300
ConsultObjAdjust(union CONSULT_OBJ * co)301 inline EXTERN union CONSULT_OBJ * ConsultObjAdjust(union CONSULT_OBJ * co)
302 {
303 return (union CONSULT_OBJ *) ((union CONSULT_OBJ *)(CharP(co)+HDiff) );
304 }
305
306
307
308 inline EXTERN DBRef DBRefAdjust(DBRef);
309
DBRefAdjust(DBRef dbr)310 inline EXTERN DBRef DBRefAdjust(DBRef dbr)
311 {
312 return (DBRef) ((DBRef)(CharP(dbr)+HDiff) );
313 }
314
315
316
317 inline EXTERN Term CodeAdjust(Term);
318
CodeAdjust(Term dbr)319 inline EXTERN Term CodeAdjust(Term dbr)
320 {
321 return (Term) (((Term)(dbr)+HDiff) );
322 }
323
324
325
326 inline EXTERN ADDR AddrAdjust(ADDR);
327
AddrAdjust(ADDR addr)328 inline EXTERN ADDR AddrAdjust(ADDR addr)
329 {
330 return (ADDR) ((ADDR)(CharP(addr)+HDiff) );
331 }
332
333
334
335 inline EXTERN CODEADDR CodeAddrAdjust(CODEADDR);
336
CodeAddrAdjust(CODEADDR addr)337 inline EXTERN CODEADDR CodeAddrAdjust(CODEADDR addr)
338 {
339 return (CODEADDR) ((CODEADDR)(CharP(addr)+HDiff) );
340 }
341
342
343
344 inline EXTERN BlockHeader * BlockAdjust(BlockHeader *);
345
BlockAdjust(BlockHeader * addr)346 inline EXTERN BlockHeader * BlockAdjust(BlockHeader * addr)
347 {
348 return (BlockHeader *) ((BlockHeader *)(CharP(addr)+HDiff) );
349 }
350
351
352
353 inline EXTERN yamop * PtoOpAdjust(yamop *);
354
PtoOpAdjust(yamop * ptr)355 inline EXTERN yamop * PtoOpAdjust(yamop * ptr)
356 {
357 return (yamop *) (((yamop *)(CharP(ptr) + HDiff)) );
358 }
359
360
361
362 inline EXTERN CELL * PtoHeapCellAdjust(CELL *);
363
PtoHeapCellAdjust(CELL * ptr)364 inline EXTERN CELL * PtoHeapCellAdjust(CELL * ptr)
365 {
366 return (CELL *) (((CELL *)(CharP(ptr) + HDiff)) );
367 }
368
369
370
371 inline EXTERN PredEntry * PtoPredAdjust(PredEntry *);
372
PtoPredAdjust(PredEntry * ptr)373 inline EXTERN PredEntry * PtoPredAdjust(PredEntry * ptr)
374 {
375 return (PredEntry *) (((PredEntry *)(CharP(ptr) + HDiff)) );
376 }
377
378
379
380 inline EXTERN ArrayEntry * PtoArrayEAdjust(ArrayEntry *);
381
PtoArrayEAdjust(ArrayEntry * ptr)382 inline EXTERN ArrayEntry * PtoArrayEAdjust(ArrayEntry * ptr)
383 {
384 return (ArrayEntry *) (((ArrayEntry *)(CharP(ptr) + HDiff)) );
385 }
386
387
388 #if PRECOMPUTE_REGADDRESS
389
390 inline EXTERN AREG XAdjust(AREG);
391
XAdjust(AREG reg)392 inline EXTERN AREG XAdjust(AREG reg)
393 {
394 return (AREG) ((AREG)((reg)+XDiff) );
395 }
396
397
398 #else
399
400 inline EXTERN AREG XAdjust(AREG);
401
XAdjust(AREG reg)402 inline EXTERN AREG XAdjust(AREG reg)
403 {
404 return (AREG) ((reg) );
405 }
406
407
408 #endif
409
410 inline EXTERN YREG YAdjust(YREG);
411
YAdjust(YREG reg)412 inline EXTERN YREG YAdjust(YREG reg)
413 {
414 return (YREG) ((reg) );
415 }
416
417
418
419
420 inline EXTERN int IsOldLocal(CELL);
421
IsOldLocal(CELL reg)422 inline EXTERN int IsOldLocal(CELL reg)
423 {
424 return (int) (IN_BETWEEN(OldASP, reg, OldLCL0));
425 }
426
427
428
429 /* require because the trail might contain dangling pointers */
430
431 inline EXTERN int IsOldLocalInTR(CELL);
432
IsOldLocalInTR(CELL reg)433 inline EXTERN int IsOldLocalInTR(CELL reg)
434 {
435 return (int) (IN_BETWEEN(OldH, reg, OldLCL0) );
436 }
437
438
439
440 inline EXTERN int IsOldLocalInTRPtr(CELL *);
441
IsOldLocalInTRPtr(CELL * ptr)442 inline EXTERN int IsOldLocalInTRPtr(CELL * ptr)
443 {
444 return (int) (IN_BETWEEN(OldH, ptr, OldLCL0) );
445 }
446
447
448
449
450 inline EXTERN int IsOldH(CELL);
451
IsOldH(CELL reg)452 inline EXTERN int IsOldH(CELL reg)
453 {
454 return (int) (( CharP(reg) == CharP(OldH) ) );
455 }
456
457
458
459
460
461 inline EXTERN int IsOldGlobal(CELL);
462
IsOldGlobal(CELL reg)463 inline EXTERN int IsOldGlobal(CELL reg)
464 {
465 return (int) (IN_BETWEEN(OldH0, reg, OldH) );
466 }
467
468
469
470 inline EXTERN int IsOldGlobalPtr(CELL *);
471
IsOldGlobalPtr(CELL * ptr)472 inline EXTERN int IsOldGlobalPtr(CELL * ptr)
473 {
474 return (int) (IN_BETWEEN( OldH0, ptr, OldH) );
475 }
476
477
478
479 inline EXTERN int IsOldDelay(CELL);
480
IsOldDelay(CELL reg)481 inline EXTERN int IsOldDelay(CELL reg)
482 {
483 return (int) (IN_BETWEEN(OldGlobalBase, reg, OldH0) );
484 }
485
486
487
488 inline EXTERN int IsOldDelayPtr(CELL *);
489
IsOldDelayPtr(CELL * ptr)490 inline EXTERN int IsOldDelayPtr(CELL * ptr)
491 {
492 return (int) (IN_BETWEEN( OldGlobalBase, ptr, OldH0) );
493 }
494
495
496
497 inline EXTERN int IsOldTrail(CELL);
498
IsOldTrail(CELL reg)499 inline EXTERN int IsOldTrail(CELL reg)
500 {
501 return (int) (IN_BETWEEN(OldTrailBase, reg, OldTR) );
502 }
503
504
505
506 inline EXTERN int IsOldTrailPtr(CELL *);
507
IsOldTrailPtr(CELL * ptr)508 inline EXTERN int IsOldTrailPtr(CELL * ptr)
509 {
510 return (int) (IN_BETWEEN(OldTrailBase, ptr, OldTR) );
511 }
512
513
514
515 inline EXTERN int IsOldCode(CELL);
516
IsOldCode(CELL reg)517 inline EXTERN int IsOldCode(CELL reg)
518 {
519 return (int) (IN_BETWEEN(OldHeapBase, reg, OldHeapTop) );
520 }
521
522
523
524 inline EXTERN int IsOldCodeCellPtr(CELL *);
525
IsOldCodeCellPtr(CELL * ptr)526 inline EXTERN int IsOldCodeCellPtr(CELL * ptr)
527 {
528 return (int) (IN_BETWEEN(OldHeapBase, ptr, OldHeapTop) );
529 }
530
531
532
533 inline EXTERN int IsGlobal(CELL);
534
IsGlobal(CELL reg)535 inline EXTERN int IsGlobal(CELL reg)
536 {
537 return (int) (IN_BETWEEN(GlobalBase, reg, H) );
538 }
539
540
541
542 void STD_PROTO(AdjustStacksAndTrail, (void));
543 void STD_PROTO(AdjustRegs, (int));
544