[project @ 1998-11-26 09:17:22 by sof]
[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 #if defined(PAR) || defined(GRAN)
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 #endif /* PAR || GRAN */
121
122 #if !defined(PAR) || defined(GRAN)
123 extern StgScanFun _ScanLink_ForeignObj;
124 #endif
125
126 extern StgScanFun _ScanLink_BH_N;
127 extern StgScanFun _ScanLink_BH_U;
128
129 #if defined(CONCURRENT)
130 extern StgScanFun _ScanLink_StkO;
131 extern StgScanFun _ScanLink_TSO;
132 extern StgScanFun _ScanLink_BQ;
133 #endif
134
135 #ifdef TICKY_TICKY
136 extern StgScanFun _ScanMove_0;
137 #endif
138 extern StgScanFun _ScanMove_1;
139 extern StgScanFun _ScanMove_2;
140 extern StgScanFun _ScanMove_3;
141 extern StgScanFun _ScanMove_4;
142 extern StgScanFun _ScanMove_5;
143 extern StgScanFun _ScanMove_6;
144 extern StgScanFun _ScanMove_7;
145 extern StgScanFun _ScanMove_8;
146 extern StgScanFun _ScanMove_9;
147 extern StgScanFun _ScanMove_10;
148 extern StgScanFun _ScanMove_11;
149 extern StgScanFun _ScanMove_12;
150
151 extern StgScanFun _ScanMove_S;
152 extern StgScanFun _ScanMove_Dyn;
153 extern StgScanFun _ScanMove_Tuple;
154 extern StgScanFun _ScanMove_Data;
155 extern StgScanFun _ScanMove_MuTuple;
156
157 #if defined(PROFILING) || defined(TICKY_TICKY)
158 extern StgScanFun _ScanMove_PI;
159 #endif
160
161 #ifndef PAR
162 extern StgScanFun _ScanMove_ForeignObj;
163 #endif /* !PAR */
164
165 extern StgScanFun _ScanMove_ImmuTuple;
166 extern StgScanFun _ScanMove_BH_N;
167 extern StgScanFun _ScanMove_BH_U;
168
169 #if defined(CONCURRENT)
170 extern StgScanFun _ScanMove_StkO;
171 extern StgScanFun _ScanMove_TSO;
172 extern StgScanFun _ScanMove_BQ;
173 #if defined(PAR)
174 extern StgScanFun _ScanMove_FetchMe;
175 extern StgScanFun _ScanMove_BF;
176 #endif
177 #endif
178 \end{code}
179
180 End of multi-slurp protection:
181 \begin{code}
182 #endif /* SMCOMPACT_H */
183 \end{code}