[project @ 1996-01-08 20:28:12 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 extern StgScanFun _ScanLink_1_0;
53 extern StgScanFun _ScanLink_2_0;
54 extern StgScanFun _ScanLink_3_0;
55 extern StgScanFun _ScanLink_4_0;
56 extern StgScanFun _ScanLink_5_0;
57
58 extern StgScanFun _ScanLink_2_1; /* 1 ptr,  1 non-ptr  */
59 extern StgScanFun _ScanLink_3_1; /* 1 ptr,  2 non-ptrs */
60 extern StgScanFun _ScanLink_3_2; /* 2 ptrs, 1 non-ptr  */
61
62 extern StgScanFun _ScanLink_1_1;
63 extern StgScanFun _ScanLink_2_2;
64 extern StgScanFun _ScanLink_3_3;
65 extern StgScanFun _ScanLink_4_4;
66 extern StgScanFun _ScanLink_5_5;
67 extern StgScanFun _ScanLink_6_6;
68 extern StgScanFun _ScanLink_7_7;
69 extern StgScanFun _ScanLink_8_8;
70 extern StgScanFun _ScanLink_9_9;
71 extern StgScanFun _ScanLink_10_10;
72 extern StgScanFun _ScanLink_11_11;
73 extern StgScanFun _ScanLink_12_12;
74
75 extern StgScanFun _ScanLink_S_N;
76 extern StgScanFun _ScanLink_Dyn;
77 extern StgScanFun _ScanLink_Tuple;
78 extern StgScanFun _ScanLink_Data;
79 extern StgScanFun _ScanLink_MuTuple;
80
81 #ifdef USE_COST_CENTRES
82 extern StgScanFun _ScanLink_PI;
83 #endif
84
85 #ifdef PAR
86 extern StgScanFun _ScanLink_RBH_2_1;
87 extern StgScanFun _ScanLink_RBH_3_1;
88 extern StgScanFun _ScanLink_RBH_3_3;
89 extern StgScanFun _ScanLink_RBH_4_1;
90 extern StgScanFun _ScanLink_RBH_4_4;
91 extern StgScanFun _ScanLink_RBH_5_1;
92 extern StgScanFun _ScanLink_RBH_5_5;
93 extern StgScanFun _ScanLink_RBH_6_6;
94 extern StgScanFun _ScanLink_RBH_7_7;
95 extern StgScanFun _ScanLink_RBH_8_8;
96 extern StgScanFun _ScanLink_RBH_9_9;
97 extern StgScanFun _ScanLink_RBH_10_10;
98 extern StgScanFun _ScanLink_RBH_11_11;
99 extern StgScanFun _ScanLink_RBH_12_12;
100 extern StgScanFun _ScanLink_RBH_N;
101 extern StgScanFun _ScanLink_FetchMe;
102 extern StgScanFun _ScanLink_BF;
103
104 extern StgScanFun _ScanMove_RBH_2;
105 extern StgScanFun _ScanMove_RBH_3;
106 extern StgScanFun _ScanMove_RBH_4;
107 extern StgScanFun _ScanMove_RBH_5;
108 extern StgScanFun _ScanMove_RBH_6;
109 extern StgScanFun _ScanMove_RBH_7;
110 extern StgScanFun _ScanMove_RBH_8;
111 extern StgScanFun _ScanMove_RBH_9;
112 extern StgScanFun _ScanMove_RBH_10;
113 extern StgScanFun _ScanMove_RBH_11;
114 extern StgScanFun _ScanMove_RBH_12;
115
116 extern StgScanFun _ScanMove_RBH_S;
117
118 #else
119 extern StgScanFun _ScanLink_MallocPtr;
120 #endif /* PAR */
121
122 extern StgScanFun _ScanLink_BH_N;
123 extern StgScanFun _ScanLink_BH_U;
124
125 #if defined(CONCURRENT)
126 extern StgScanFun _ScanLink_StkO;
127 extern StgScanFun _ScanLink_TSO;
128 extern StgScanFun _ScanLink_BQ;
129 #endif
130
131 extern StgScanFun _ScanMove_1;
132 extern StgScanFun _ScanMove_2;
133 extern StgScanFun _ScanMove_3;
134 extern StgScanFun _ScanMove_4;
135 extern StgScanFun _ScanMove_5;
136 extern StgScanFun _ScanMove_6;
137 extern StgScanFun _ScanMove_7;
138 extern StgScanFun _ScanMove_8;
139 extern StgScanFun _ScanMove_9;
140 extern StgScanFun _ScanMove_10;
141 extern StgScanFun _ScanMove_11;
142 extern StgScanFun _ScanMove_12;
143
144 extern StgScanFun _ScanMove_S;
145 extern StgScanFun _ScanMove_Dyn;
146 extern StgScanFun _ScanMove_Tuple;
147 extern StgScanFun _ScanMove_Data;
148 extern StgScanFun _ScanMove_MuTuple;
149
150 #ifdef USE_COST_CENTRES
151 extern StgScanFun _ScanMove_PI;
152 #endif
153
154 #ifndef PAR
155 extern StgScanFun _ScanMove_MallocPtr;
156 #endif /* !PAR */
157
158 extern StgScanFun _ScanMove_ImmuTuple;
159 extern StgScanFun _ScanMove_BH_N;
160 extern StgScanFun _ScanMove_BH_U;
161
162 #if defined(CONCURRENT)
163 extern StgScanFun _ScanMove_StkO;
164 extern StgScanFun _ScanMove_TSO;
165 extern StgScanFun _ScanMove_BQ;
166 #if defined(PAR)
167 extern StgScanFun _ScanMove_FetchMe;
168 extern StgScanFun _ScanMove_BF;
169 #endif
170 #endif
171 \end{code}
172
173 End of multi-slurp protection:
174 \begin{code}
175 #endif /* SMCOMPACT_H */
176 \end{code}