]>
Commit | Line | Data |
---|---|---|
885824d3 | 1 | /* |
2 | ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. | |
3 | ** See ../LICENSE for license information. | |
4 | */ | |
5 | /* | |
6 | ** usymtab.h | |
7 | */ | |
8 | ||
9 | # ifndef USYMTAB_H | |
10 | # define USYMTAB_H | |
a0a162cd | 11 | #include "environmentTable.h" |
885824d3 | 12 | |
13 | /*@constant null usymtab GLOBAL_ENV; @*/ | |
14 | # define GLOBAL_ENV usymtab_undefined | |
15 | ||
16 | typedef enum { | |
17 | US_GLOBAL, | |
18 | US_NORMAL, | |
19 | US_TBRANCH, US_FBRANCH, | |
20 | US_CBRANCH, US_SWITCH | |
21 | } uskind; | |
22 | ||
23 | typedef struct _refentry { int level; int index; } *refentry; | |
24 | typedef /*@only@*/ refentry o_refentry; | |
25 | typedef o_refentry *refTable; | |
26 | ||
27 | struct _usymtab | |
28 | { | |
29 | uskind kind; | |
30 | int nentries; | |
31 | int nspace; | |
32 | int lexlevel; | |
33 | bool mustBreak; | |
34 | exitkind exitCode; | |
35 | /*@reldef@*/ /*@only@*/ o_uentry *entries; | |
36 | /*@null@*/ /*@only@*/ hashTable htable; /* for the global environment */ | |
37 | /*@null@*/ /*@only@*/ refTable reftable; /* for branched environments */ | |
38 | /*@only@*/ guardSet guards; /* guarded references (not null) */ | |
39 | aliasTable aliases; | |
40 | /*@owned@*/ usymtab env; | |
a0a162cd | 41 | environmentTable environment; |
885824d3 | 42 | } ; |
43 | ||
44 | /* | |
45 | ** rep invariant: | |
46 | ** | |
47 | ** (left as exercise to reader) ;) | |
48 | */ | |
49 | ||
50 | extern void usymtab_printTypes (void) | |
51 | /*@globals internalState@*/ | |
52 | /*@modifies g_msgstream@*/ ; | |
53 | ||
54 | extern void usymtab_setMustBreak (void) /*@modifies internalState@*/ ; | |
55 | ||
56 | extern bool usymtab_inGlobalScope (void) /*@globals internalState@*/ ; | |
57 | extern bool usymtab_inFunctionScope (void) /*@globals internalState@*/ ; | |
58 | extern bool usymtab_inFileScope (void) /*@globals internalState@*/ ; | |
59 | extern void usymtab_checkFinalScope (bool p_isReturn) | |
60 | /*@globals internalState@*/ | |
61 | /*@modifies *g_msgstream@*/ ; | |
62 | ||
63 | extern void usymtab_allUsed (void) | |
64 | /*@globals internalState@*/ | |
65 | /*@modifies *g_msgstream@*/ ; | |
66 | ||
67 | extern void usymtab_allDefined (void) | |
68 | /*@globals internalState@*/ | |
69 | /*@modifies *g_msgstream@*/ ; | |
70 | ||
71 | extern void usymtab_prepareDump (void) | |
72 | /*@modifies internalState@*/ ; | |
73 | ||
74 | extern void usymtab_dump (FILE *p_fout) | |
75 | /*@globals internalState@*/ | |
76 | /*@modifies *p_fout@*/ ; | |
77 | ||
78 | ||
79 | extern void usymtab_load (FILE *p_f) /*@modifies p_f, internalState@*/ ; | |
80 | ||
81 | extern /*@exposed@*/ /*@dependent@*/ uentry | |
82 | usymtab_getRefQuiet (int p_level, usymId p_index) | |
83 | /*@globals internalState@*/ ; | |
84 | ||
85 | extern void usymtab_printLocal (void) | |
86 | /*@globals internalState@*/ | |
87 | /*@modifies stdout@*/ ; | |
88 | ||
89 | extern /*@exposed@*/ /*@dependent@*/ uentry usymtab_getParam (int p_paramno) | |
90 | /*@globals internalState@*/; | |
91 | extern void usymtab_free (void) /*@modifies internalState@*/ ; | |
92 | extern bool usymtab_inDeepScope (void) /*@globals internalState@*/ ; | |
93 | ||
94 | extern /*@exposed@*/ uentry usymtab_lookupExpose (cstring p_k) | |
95 | /*@globals internalState@*/ ; | |
96 | extern /*@observer@*/ uentry usymtab_lookup (cstring p_k) | |
97 | /*@globals internalState@*/ ; | |
98 | # define usymtab_lookup(s) (usymtab_lookupExpose (s)) | |
99 | ||
100 | extern /*@observer@*/ uentry usymtab_lookupGlob (cstring p_k) | |
101 | /*@globals internalState@*/ ; | |
102 | extern /*@exposed@*/ uentry usymtab_lookupExposeGlob (cstring p_k) | |
103 | /*@globals internalState@*/ ; | |
104 | extern /*@observer@*/ uentry usymtab_lookupUnionTag (cstring p_k) | |
105 | /*@globals internalState@*/ ; | |
106 | extern /*@observer@*/ uentry usymtab_lookupStructTag (cstring p_k) | |
107 | /*@globals internalState@*/ ; | |
108 | extern /*@observer@*/ uentry usymtab_lookupEither (cstring p_k) | |
109 | /*@globals internalState@*/ ; | |
110 | ||
111 | # ifndef NOLCL | |
112 | extern ctype usymtab_lookupType (cstring p_k) | |
113 | /*@globals internalState@*/ ; | |
114 | # endif | |
115 | ||
116 | extern bool usymtab_isProbableNull (sRef p_s) | |
117 | /*@globals internalState@*/ ; | |
118 | extern bool usymtab_isProbableDeepNull (sRef p_s) | |
119 | /*@globals internalState@*/ ; | |
120 | ||
121 | # ifndef NOLCL | |
122 | extern usymId usymtab_supExposedTypeEntry (/*@only@*/ uentry p_e, bool p_dodef) | |
123 | /*@modifies internalState, p_e@*/ ; | |
124 | # endif | |
125 | ||
126 | extern ctype usymtab_supTypeEntry (/*@only@*/ uentry p_e) | |
127 | /*@modifies internalState, p_e@*/ ; | |
128 | ||
129 | extern /*@exposed@*/ uentry usymtab_supReturnTypeEntry (/*@only@*/ uentry p_e) | |
130 | /*@modifies internalState@*/ ; | |
131 | ||
132 | extern /*@observer@*/ uentry usymtab_lookupSafe (cstring p_k) | |
133 | /*@globals internalState@*/ ; | |
134 | ||
135 | extern /*@observer@*/ uentry usymtab_getGlobalEntry (usymId p_uid) | |
136 | /*@globals internalState@*/ ; | |
137 | ||
138 | extern bool usymtab_exists (cstring p_k) | |
139 | /*@globals internalState@*/ ; | |
140 | ||
141 | # ifndef NOLCL | |
142 | extern bool usymtab_existsVar (cstring p_k) | |
143 | /*@globals internalState@*/ ; | |
144 | # endif | |
145 | ||
146 | extern bool usymtab_existsGlob (cstring p_k) | |
147 | /*@globals internalState@*/ ; | |
148 | ||
149 | extern bool usymtab_existsType (cstring p_k) | |
150 | /*@globals internalState@*/ ; | |
151 | ||
152 | # ifndef NOLCL | |
153 | extern bool usymtab_existsEither (cstring p_k) | |
154 | /*@globals internalState@*/ ; | |
155 | # endif | |
156 | ||
157 | extern bool usymtab_existsTypeEither (cstring p_k) | |
158 | /*@globals internalState@*/ ; | |
159 | ||
160 | extern usymId usymtab_getId (cstring p_k) /*@globals internalState@*/ ; | |
161 | extern usymId usymtab_getTypeId (cstring p_k) /*@globals internalState@*/ ; | |
162 | ||
163 | extern void usymtab_supEntry (/*@only@*/ uentry p_e) | |
164 | /*@modifies internalState, p_e@*/ ; | |
165 | ||
166 | # ifndef NOLCL | |
167 | extern void usymtab_replaceEntry (/*@only@*/ uentry p_s) | |
168 | /*@modifies internalState, p_s@*/ ; | |
169 | # endif | |
170 | ||
171 | extern void usymtab_supEntrySref (/*@only@*/ uentry p_e) | |
172 | /*@modifies internalState, p_e@*/ ; | |
173 | ||
174 | extern void usymtab_supGlobalEntry (/*@only@*/ uentry p_e) | |
175 | /*@modifies internalState@*/ ; | |
176 | ||
177 | extern void usymtab_addGlobalEntry (/*@only@*/ uentry p_e) | |
178 | /*@modifies internalState, p_e@*/ ; | |
179 | ||
180 | extern /*@exposed@*/ uentry | |
181 | usymtab_supEntryReturn (/*@only@*/ uentry p_e) | |
182 | /*@modifies internalState, p_e@*/ ; | |
183 | ||
184 | extern usymId usymtab_addEntry (/*@only@*/ uentry p_e) | |
185 | /*@modifies internalState, p_e@*/ ; | |
186 | ||
187 | extern ctype usymtab_lookupAbstractType (cstring p_k) | |
188 | /*@globals internalState@*/ ; | |
189 | extern bool usymtab_matchForwardStruct (usymId p_u1, usymId p_u2) | |
190 | /*@globals internalState@*/ ; | |
191 | ||
192 | extern bool usymtab_existsEnumTag (cstring p_k) | |
193 | /*@globals internalState@*/ ; | |
194 | extern bool usymtab_existsUnionTag (cstring p_k) | |
195 | /*@globals internalState@*/ ; | |
196 | extern bool usymtab_existsStructTag (cstring p_k) | |
197 | /*@globals internalState@*/ ; | |
198 | ||
199 | extern usymId usymId_fromInt (int p_i) /*@*/ ; | |
200 | # define usymId_fromInt(i) ((usymId)(i)) | |
201 | ||
202 | extern bool usymId_isInvalid (usymId p_u) /*@*/ ; | |
203 | # define usymId_isInvalid(u) ((u) == USYMIDINVALID) | |
204 | ||
205 | extern bool usymId_isValid (usymId p_u) /*@*/ ; | |
206 | # define usymId_isValid(u) ((u) != USYMIDINVALID) | |
207 | ||
208 | extern bool typeId_isInvalid (typeId p_u) /*@*/ ; | |
209 | # define typeId_isInvalid(u) ((u) == typeId_invalid) | |
210 | ||
211 | extern bool typeId_isValid (typeId p_u) /*@*/ ; | |
212 | # define typeId_isValid(u) ((u) != typeId_invalid) | |
213 | ||
214 | extern bool typeId_equal (typeId p_u1, typeId p_u2) /*@*/ ; | |
215 | # define typeId_equal(u1,u2) ((u1) == (u2)) | |
216 | ||
217 | extern typeId typeId_fromInt (int p_i); | |
218 | # define typeId_fromInt(i) ((typeId)(i)) | |
219 | ||
220 | /*@iter usymtab_entries (sef usymtab u, yield exposed uentry el); @*/ | |
221 | # define usymtab_entries(x, m_i) \ | |
222 | { int m_ind; \ | |
223 | if (usymtab_isDefined (x)) \ | |
224 | for (m_ind = 0; m_ind < (x)->nentries; m_ind++) \ | |
225 | { uentry m_i = (x)->entries[m_ind]; | |
226 | ||
227 | # define end_usymtab_entries }} | |
228 | ||
229 | extern /*@unused@*/ void usymtab_displayAllUses (void) | |
230 | /*@globals internalState@*/ | |
231 | /*@modifies *g_msgstream@*/ ; | |
232 | ||
233 | extern /*@unused@*/ void usymtab_printOut (void) | |
234 | /*@globals internalState@*/ | |
235 | /*@modifies *g_msgstream@*/ ; | |
236 | ||
237 | extern /*@unused@*/ void usymtab_printAll (void) | |
238 | /*@globals internalState@*/ | |
239 | /*@modifies *g_msgstream@*/ ; | |
240 | ||
241 | extern void usymtab_enterScope (void) | |
242 | /*@modifies internalState;@*/ ; | |
243 | extern void usymtab_enterFunctionScope (uentry p_fcn) | |
244 | /*@modifies internalState;@*/ ; | |
245 | extern void usymtab_quietExitScope (fileloc p_loc) | |
246 | /*@modifies internalState;@*/ ; | |
247 | extern void usymtab_exitScope (exprNode p_expr) /*@modifies internalState@*/ ; | |
248 | extern void usymtab_addGuards (guardSet p_guards) /*@modifies internalState@*/ ; | |
249 | extern void usymtab_setExitCode (exitkind p_ex) /*@modifies internalState@*/ ; | |
250 | extern void usymtab_exitFile (void) /*@modifies internalState@*/ ; | |
251 | extern void usymtab_enterFile (void) /*@modifies internalState@*/ ; | |
252 | ||
253 | extern /*@observer@*/ uentry usymtab_lookupEnumTag (cstring p_k) | |
254 | /*@globals internalState@*/ ; | |
255 | ||
256 | extern usymId usymtab_convertId (usymId p_uid) /*@globals internalState@*/ ; | |
257 | extern void usymtab_initMod (void) /*@modifies internalState@*/ ; | |
258 | extern void usymtab_initBool (void) /*@modifies internalState@*/ ; | |
259 | ||
260 | extern void usymtab_exportHeader (void) | |
261 | /*@modifies internalState@*/ ; | |
262 | ||
263 | extern ctype usymtab_structFieldsType (uentryList p_f) | |
264 | /*@globals internalState@*/ ; | |
265 | ||
266 | extern ctype usymtab_unionFieldsType (uentryList p_f) | |
267 | /*@globals internalState@*/ ; | |
268 | ||
269 | extern ctype usymtab_enumEnumNameListType (enumNameList p_f) | |
270 | /*@globals internalState@*/ ; | |
271 | ||
272 | extern /*@exposed@*/ uentry usymtab_getTypeEntrySafe (usymId p_uid) | |
273 | /*@globals internalState@*/ ; | |
274 | ||
275 | extern void usymtab_popOrBranch (exprNode p_pred, exprNode p_expr) | |
276 | /*@modifies internalState@*/ ; | |
277 | extern void usymtab_popAndBranch (exprNode p_pred, exprNode p_expr) | |
278 | /*@modifies internalState@*/ ; | |
279 | ||
280 | extern void usymtab_trueBranch (/*@only@*/ guardSet p_guards) | |
281 | /*@modifies internalState@*/ ; | |
282 | extern void usymtab_altBranch (/*@only@*/ guardSet p_guards) | |
283 | /*@modifies internalState@*/ ; | |
284 | ||
285 | extern void usymtab_popTrueBranch (exprNode p_pred, exprNode p_expr, clause p_cl) | |
286 | /*@modifies internalState@*/ ; | |
287 | extern void | |
288 | usymtab_popTrueExecBranch (exprNode p_pred, exprNode p_expr, clause p_cl) | |
289 | /*@modifies internalState@*/ ; | |
290 | ||
291 | extern void | |
292 | usymtab_popBranches (exprNode p_pred, exprNode p_tbranch, exprNode p_fbranch, | |
293 | bool p_isOpt, clause p_cl) | |
294 | /*@modifies internalState@*/ ; | |
295 | ||
296 | extern void usymtab_unguard (sRef p_s) /*@modifies internalState@*/ ; | |
297 | extern bool usymtab_isGuarded (sRef p_s) /*@globals internalState@*/ ; | |
298 | extern void usymtab_printGuards (void) /*@globals internalState@*/ /*@modifies *g_msgstream@*/ ; | |
299 | extern void usymtab_quietPlainExitScope (void) /*@modifies internalState@*/ ; | |
300 | extern void usymtab_printComplete (void) /*@globals internalState@*/ /*@modifies *stdout@*/ ; | |
301 | ||
302 | # ifndef NOLCL | |
303 | extern bool usymtab_existsGlobEither (cstring p_k) /*@globals internalState@*/ ; | |
304 | # endif | |
305 | ||
306 | extern bool usymtab_isBoolType (usymId p_uid) /*@globals internalState@*/ ; | |
307 | extern /*@only@*/ cstring | |
308 | usymtab_getTypeEntryName (usymId p_uid) | |
309 | /*@globals internalState@*/ ; | |
310 | extern /*@exposed@*/ uentry usymtab_getTypeEntry (usymId p_uid) | |
311 | /*@globals internalState@*/ ; | |
312 | ||
313 | extern usymId | |
314 | usymtab_supAbstractTypeEntry (/*@only@*/ uentry p_e, bool p_dodef) | |
315 | /*@modifies internalState, p_e@*/ ; | |
316 | extern ctype usymtab_supForwardTypeEntry (/*@only@*/ uentry p_e) | |
317 | /*@modifies internalState, p_e@*/ ; | |
318 | ||
319 | extern /*@exposed@*/ uentry | |
320 | usymtab_supGlobalEntryReturn (/*@only@*/ uentry p_e) | |
321 | /*@modifies internalState, p_e@*/ ; | |
322 | ||
323 | extern /*@exposed@*/ uentry | |
324 | usymtab_supEntrySrefReturn (/*@only@*/ uentry p_e) | |
325 | /*@modifies internalState, p_e@*/ ; | |
326 | ||
327 | extern int uentry_directParamNo (uentry p_ue) | |
328 | /*@globals internalState@*/ ; | |
329 | ||
330 | extern bool usymtab_newCase (exprNode p_pred, exprNode p_last) | |
331 | /*@modifies internalState@*/ ; | |
332 | ||
333 | extern void usymtab_switchBranch (exprNode p_s) | |
334 | /*@modifies internalState@*/ ; | |
335 | ||
336 | extern /*@only@*/ cstring usymtab_unparseStack (void) | |
337 | /*@globals internalState@*/ ; | |
338 | extern void usymtab_exitSwitch (exprNode p_sw, bool p_allpaths) | |
339 | /*@modifies internalState@*/ ; | |
340 | ||
341 | extern /*@observer@*/ uentry usymtab_lookupGlobSafe (cstring p_k) | |
342 | /*@globals internalState@*/ ; | |
343 | ||
344 | extern /*@only@*/ sRefSet usymtab_aliasedBy (sRef p_s) | |
345 | /*@globals internalState@*/ ; | |
346 | ||
347 | extern /*@only@*/ sRefSet usymtab_canAlias (sRef p_s) | |
348 | /*@globals internalState@*/ ; | |
349 | ||
350 | extern void usymtab_clearAlias (sRef p_s) | |
351 | /*@modifies internalState, p_s@*/ ; | |
352 | ||
353 | extern void usymtab_addMustAlias (sRef p_s, sRef p_al) | |
354 | /*@modifies internalState@*/ ; | |
355 | ||
356 | extern void usymtab_addForceMustAlias (sRef p_s, sRef p_al) | |
357 | /*@modifies internalState@*/ ; | |
358 | ||
359 | extern /*@only@*/ cstring usymtab_unparseAliases (void) | |
360 | /*@globals internalState@*/ ; | |
361 | ||
362 | extern /*@exposed@*/ uentry | |
363 | usymtab_supReturnFileEntry (/*@only@*/ uentry p_e) | |
364 | /*@modifies internalState@*/ ; | |
365 | ||
366 | extern bool usymtab_isAltProbablyDeepNull (sRef p_s) | |
367 | /*@globals internalState@*/ ; | |
368 | ||
369 | extern bool usymtab_existsReal (cstring p_k) | |
370 | /*@globals internalState@*/ ; | |
371 | ||
372 | extern /*@only@*/ sRefSet usymtab_allAliases (sRef p_s) | |
373 | /*@globals internalState@*/ ; | |
374 | ||
375 | extern void usymtab_exportLocal (void) | |
376 | /*@modifies internalState@*/ ; | |
377 | ||
378 | extern void usymtab_popCaseBranch (void) | |
379 | /*@modifies internalState@*/ ; | |
380 | ||
381 | /* special scopes */ | |
382 | ||
383 | /*@constant int globScope;@*/ | |
384 | # define globScope 0 /* global variables */ | |
385 | ||
386 | /*@constant int fileScope;@*/ | |
387 | # define fileScope 1 /* file-level static variables */ | |
388 | ||
389 | /*@constant int paramsScope;@*/ | |
390 | # define paramsScope 2 /* function parameters */ | |
391 | ||
392 | /*@constant int functionScope;@*/ | |
393 | # define functionScope 3 | |
394 | ||
395 | extern /*@falsenull@*/ bool usymtab_isDefined (usymtab p_u) /*@*/ ; | |
396 | ||
397 | /*@constant null usymtab usymtab_undefined; @*/ | |
398 | # define usymtab_undefined ((usymtab)NULL) | |
399 | # define usymtab_isDefined(u) ((u) != usymtab_undefined) | |
400 | ||
401 | extern void usymtab_checkDistinctName (uentry p_e, int p_scope) | |
402 | /*@globals internalState@*/ | |
403 | /*@modifies *g_msgstream, p_e@*/ ; | |
404 | ||
4cccc6ad | 405 | |
406 | /*DRL add 9/4/00 */ | |
407 | extern | |
408 | extern void usymtab_testInRange (sRef p_s, int p_index) /*@modifies internalState;@*/; | |
409 | extern void usymtab_postopVar (sRef p_sr) /*@modifies internalState;@*/ ; | |
410 | ||
411 | ||
885824d3 | 412 | # else |
413 | # error "Multiple include" | |
414 | # endif | |
415 | ||
416 | ||
417 |