Pristine Ack-5.5
[Ack-5.5.git] / util / int / shadow.h
1 /*
2         Shadowbyte macros
3 */
4
5 /* $Id: shadow.h,v 2.4 1994/06/24 10:49:06 ceriel Exp $ */
6
7 #include        "logging.h"
8
9 #ifdef  LOGGING
10
11 extern char *data_sh;           /* shadowbytes of data space */
12 extern char *stack_sh;          /* shadowbytes of stack space */
13 extern char *stackML_sh;        /* stack_sh + ML (to speed up stack access) */
14
15 /* Bit 0, 1, 2 and 3: datatype/pointertype. */
16
17 #define SH_INT          (0x01)
18 #define SH_FLOAT        (0x02)
19 #define SH_DATAP        (0x04)
20 #define SH_INSP         (0x08)
21
22 /* Bit 7: protection bit */
23
24 #define SH_PROT         (0x80)
25
26 /******** Shadowbytes, general ********/
27
28 #define dt_sh(a)        (*(data_sh + (p2i(a))))
29 #define st_sh(a)        (*(stackML_sh - (a)))
30 #define mem_sh(a)       (in_stack(a) ? st_sh(a) : dt_sh(a))
31
32 /******** Shadowbytes settings for data ********/
33
34 #define dt_undef(a)     (dt_sh(a) = UNDEFINED)
35
36 #define dt_int(a)       (dt_sh(a) = SH_INT)
37 #define dt_fl(a)        (dt_sh(a) = SH_FLOAT)
38 #define dt_ip(a)        (dt_sh(a) = SH_INSP)
39 #define dt_dp(a)        (dt_sh(a) = SH_DATAP)
40
41 #define dt_prot2b(a)    { dt_sh(a) |= SH_PROT; dt_sh(a+1) |= SH_PROT; }
42 #define dt_unpr2b(a)    { dt_sh(a) &= ~SH_PROT; dt_sh(a+1) &= ~SH_PROT; }
43 #define dt_prot(a,n)    {       dt_prot2b(a); \
44                                 if ((n) == 4) { dt_prot2b(a+2); } }
45 #define dt_unprot(a,n)  {       dt_unpr2b(a); \
46                                 if ((n) == 4) { dt_unpr2b(a+2); } }
47
48 /******** Shadowbytes settings for stack ********/
49
50 #define st_undef(a)     (st_sh(a) = UNDEFINED)
51
52 #define st_int(a)       (st_sh(a) = SH_INT)
53 #define st_fl(a)        (st_sh(a) = SH_FLOAT)
54 #define st_ip(a)        (st_sh(a) = SH_INSP)
55 #define st_dp(a)        (st_sh(a) = SH_DATAP)
56
57 #define st_prot2b(a)    { st_sh(a) |= SH_PROT; st_sh(a+1) |= SH_PROT; }
58 #define st_unpr2b(a)    { st_sh(a) &= ~SH_PROT; st_sh(a+1) &= ~SH_PROT; }
59 #define st_prot(a,n)    {       st_prot2b(a); \
60                                 if ((n) == 4) { st_prot2b(a+2); } }
61 #define st_unprot(a,n)  {       st_unpr2b(a); \
62                                 if ((n) == 4) { st_unpr2b(a+2); } }
63
64 /******** Shadowbytes checking for data ********/
65
66 #define is_dt_set(a,n,s)        ((dt_sh(a) & s) && (dt_sh(a+(n-1)) & s))
67 #define is_dt_prot(a)           (dt_sh(a) & SH_PROT)
68 #define ch_dt_prot(a)           { if (is_dt_prot(a)) warning(WDESROM); }
69
70 /******** Shadowbytes checking for stack ********/
71
72 #define is_st_set(a,n,s)        ((st_sh(a) & s) && (st_sh(a+(n-1)) & s))
73 #define is_st_prot(a)           (st_sh(a) & SH_PROT)
74 #define ch_st_prot(a)           { if (is_st_prot(a)) warning(WDESRSB); }
75
76 #else
77
78 #define dt_undef(a)
79
80 #define dt_int(a)
81 #define dt_fl(a)
82 #define dt_ip(a)
83 #define dt_dp(a)
84
85 #define dt_prot(a,n)
86 #define dt_unprot(a,b)
87
88 #define st_undef(a)
89
90 #define st_int(a)
91 #define st_fl(a)
92 #define st_ip(a)
93 #define st_dp(a)
94
95 #define st_prot(a,n)
96 #define st_unprot(a,b)
97
98 #define ch_dt_prot(a)
99 #define ch_st_prot(a)
100
101 #endif  /* LOGGING */
102