[project @ 1996-01-11 14:06:51 by partain]
[ghc-hetmet.git] / ghc / includes / SMcompact.lh
1 %************************************************************************
2 %*                                                                      *
3 \section[SMcompact]{Code labels for single-space compacting collectors}
4 %*                                                                      *
5 %************************************************************************
6 Multi-slurp protection:
7 \begin{code}
8 #ifndef SMCOMPACT_H
9 #define SMCOMPACT_H
10 \end{code}
11 First, some potentially non-portable macros for marking locations.
12 During compacting, we use the info pointer field of a closure to 
13 maintain a list of locations that point to the closure.  The actual
14 info pointer is saved at the end of the list.  When we traverse this
15 list, we need to be able to distinguish the info pointer from an
16 arbitrary location (possibly in the heap, but possibly elsewhere).
17 So, we set a bit on the locations as we add them to the list.
18 This has to be a bit that is always going to be clear on an info
19 pointer.  Since info tables are typically word-aligned, we hope that
20 the 0 bit will suffice for most implementations.
21
22 \begin{code}
23
24 #define CLEAR_PTR_BIT           (0)
25
26 #define MARKED_LOCATION_MASK    (1L<<CLEAR_PTR_BIT)
27
28 #define MARK_LOCATION(loc)      (((W_)(loc)) | MARKED_LOCATION_MASK)
29 #define UNMARK_LOCATION(loc)    ((P_)(((W_)(loc)) & ~MARKED_LOCATION_MASK))
30
31 #define MARKED_LOCATION(loc)    ((((W_)(loc)) & MARKED_LOCATION_MASK) != 0)
32
33 \end{code}
34
35 A dynamic closure has to be recognizable even after it has lost its
36 info pointer as a result of the linking described above.  We first test
37 to see if its info pointer is a marked location (in which case, it must
38 be a dynamic closure), and if it isn't, we check the rep table to see
39 if it's not static.
40
41 \begin{code}
42
43 #define DYNAMIC_CLOSURE(c)  (MARKED_LOCATION(INFO_PTR(c)) || !IS_STATIC(INFO_PTR(c)))
44
45 \end{code}
46
47 \begin{code}
48
49 typedef I_ (StgScanFun)(STG_NO_ARGS);
50 typedef I_ (*StgScanPtr)(STG_NO_ARGS);
51
52 #ifdef TICKY_TICKY
53 extern StgScanFun _ScanLink_0_0;
54 #endif
55 extern StgScanFun _ScanLink_1_0;
56 extern StgScanFun _ScanLink_2_0;
57 extern StgScanFun _ScanLink_3_0;
58 extern StgScanFun _ScanLink_4_0;
59 extern StgScanFun _ScanLink_5_0;
60
61 extern StgScanFun _ScanLink_2_1; /* 1 ptr,  1 non-ptr  */
62 extern StgScanFun _ScanLink_3_1; /* 1 ptr,  2 non-ptrs */
63 extern StgScanFun _ScanLink_3_2; /* 2 ptrs, 1 non-ptr  */
64
65 extern StgScanFun _ScanLink_1_1;
66 extern StgScanFun _ScanLink_2_2;
67 extern StgScanFun _ScanLink_3_3;
68 extern StgScanFun _ScanLink_4_4;
69 extern StgScanFun _ScanLink_5_5;
70 extern StgScanFun _ScanLink_6_6;
71 extern StgScanFun _ScanLink_7_7;
72 extern StgScanFun _ScanLink_8_8;
73 extern StgScanFun _ScanLink_9_9;
74 extern StgScanFun _ScanLink_10_10;
75 extern StgScanFun _ScanLink_11_11;
76 extern StgScanFun _ScanLink_12_12;
77
78 extern StgScanFun _ScanLink_S_N;
79 extern StgScanFun _ScanLink_Dyn;
80 extern StgScanFun _ScanLink_Tuple;
81 extern StgScanFun _ScanLink_Data;
82 extern StgScanFun _ScanLink_MuTuple;
83
84 #if defined(PROFILING) || defined(TICKY_TICKY)
85 extern StgScanFun _ScanLink_PI;
86 #endif
87
88 #ifdef PAR
89 extern StgScanFun _ScanLink_RBH_2_1;
90 extern StgScanFun _ScanLink_RBH_3_1;
91 extern StgScanFun _ScanLink_RBH_3_3;
92 extern StgScanFun _ScanLink_RBH_4_1;
93 extern StgScanFun _ScanLink_RBH_4_4;
94 extern StgScanFun _ScanLink_RBH_5_1;
95 extern StgScanFun _ScanLink_RBH_5_5;
96 extern StgScanFun _ScanLink_RBH_6_6;
97 extern StgScanFun _ScanLink_RBH_7_7;
98 extern StgScanFun _ScanLink_RBH_8_8;
99 extern StgScanFun _ScanLink_RBH_9_9;
100 extern StgScanFun _ScanLink_RBH_10_10;
101 extern StgScanFun _ScanLink_RBH_11_11;
102 extern StgScanFun _ScanLink_RBH_12_12;
103 extern StgScanFun _ScanLink_RBH_N;
104 extern StgScanFun _ScanLink_FetchMe;
105 extern StgScanFun _ScanLink_BF;
106
107 extern StgScanFun _ScanMove_RBH_2;
108 extern StgScanFun _ScanMove_RBH_3;
109 extern StgScanFun _ScanMove_RBH_4;
110 extern StgScanFun _ScanMove_RBH_5;
111 extern StgScanFun _ScanMove_RBH_6;
112 extern StgScanFun _ScanMove_RBH_7;
113 extern StgScanFun _ScanMove_RBH_8;
114 extern StgScanFun _ScanMove_RBH_9;
115 extern StgScanFun _ScanMove_RBH_10;
116 extern StgScanFun _ScanMove_RBH_11;
117 extern StgScanFun _ScanMove_RBH_12;
118
119 extern StgScanFun _ScanMove_RBH_S;
120
121 #else
122 extern StgScanFun _ScanLink_MallocPtr;
123 #endif /* PAR */
124
125 extern StgScanFun _ScanLink_BH_N;
126 extern StgScanFun _ScanLink_BH_U;
127
128 #if defined(CONCURRENT)
129 extern StgScanFun _ScanLink_StkO;
130 extern StgScanFun _ScanLink_TSO;
131 extern StgScanFun _ScanLink_BQ;
132 #endif
133
134 #ifdef TICKY_TICKY
135 extern StgScanFun _ScanMove_0;
136 #endif
137 extern StgScanFun _ScanMove_1;
138 extern StgScanFun _ScanMove_2;
139 extern StgScanFun _ScanMove_3;
140 extern StgScanFun _ScanMove_4;
141 extern StgScanFun _ScanMove_5;
142 extern StgScanFun _ScanMove_6;
143 extern StgScanFun _ScanMove_7;
144 extern StgScanFun _ScanMove_8;
145 extern StgScanFun _ScanMove_9;
146 extern StgScanFun _ScanMove_10;
147 extern StgScanFun _ScanMove_11;
148 extern StgScanFun _ScanMove_12;
149
150 extern StgScanFun _ScanMove_S;
151 extern StgScanFun _ScanMove_Dyn;
152 extern StgScanFun _ScanMove_Tuple;
153 extern StgScanFun _ScanMove_Data;
154 extern StgScanFun _ScanMove_MuTuple;
155
156 #if defined(PROFILING) || defined(TICKY_TICKY)
157 extern StgScanFun _ScanMove_PI;
158 #endif
159
160 #ifndef PAR
161 extern StgScanFun _ScanMove_MallocPtr;
162 #endif /* !PAR */
163
164 extern StgScanFun _ScanMove_ImmuTuple;
165 extern StgScanFun _ScanMove_BH_N;
166 extern StgScanFun _ScanMove_BH_U;
167
168 #if defined(CONCURRENT)
169 extern StgScanFun _ScanMove_StkO;
170 extern StgScanFun _ScanMove_TSO;
171 extern StgScanFun _ScanMove_BQ;
172 #if defined(PAR)
173 extern StgScanFun _ScanMove_FetchMe;
174 extern StgScanFun _ScanMove_BF;
175 #endif
176 #endif
177 \end{code}
178
179 End of multi-slurp protection:
180 \begin{code}
181 #endif /* SMCOMPACT_H */
182 \end{code}