]> andersk Git - splint.git/blame - src/Headers/symtable.h
Renamed truenull nullwhentrue and falsenull falsewhennull
[splint.git] / src / Headers / symtable.h
CommitLineData
885824d3 1/*
28bf4b0b 2** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001.
885824d3 3** See ../LICENSE for license information.
4*/
5/*
6** symtable.h
7*/
8
9# ifndef SYMTABLE_H
10# define SYMTABLE_H
11
12/* There are 3 separate namespaces being maintained in this symbol
13table: (N1) for C objects, functions, typedef names and enumeration
14constants. (N2) for C tags. (N3) for LSL operators. I re-use the
15old linked list to represent N1 since it is here and it is convenient
16for representing scopes. Two more new hashtables are added to store
17N2 and N3, each keyed on the lsymbol of the identifier. */
18
19/*@constant observer char *BEGINSYMTABLE;@*/
20# define BEGINSYMTABLE "%LCLSymbolTable"
21
22/*@constant observer char *SYMTABLEEND;@*/
23# define SYMTABLEEND "%LCLSymbolTableEnd"
24
25typedef long unsigned symbolKey;
26
28bf4b0b 27typedef struct {
885824d3 28 ltoken id;
29 bool export; /* all HOF maps to one sort kind: SRT_HOF */
30 /*@only@*/ signNode signature; /* in terms of sorts, no HOF */
31 /*@only@*/ pairNodeList globals; /* list of (sort globalnameSym) */
32} *fctInfo;
33
28bf4b0b 34typedef struct {
885824d3 35 ltoken id;
36 sort basedOn;
37 bool abstract; /* TRUE means LCL abstract type */
38 bool modifiable; /* TRUE indicates the abstract type is mutable */
39 bool export; /* if TRUE, export it from this module */
40} *typeInfo;
41
42typedef enum
43{
44 VRK_CONST, /* an LCL constant */
45 VRK_ENUM, /* an enumeration constant,
46 a special kind of LCL constant */
47 VRK_VAR, /* an LCL variable */
48 VRK_PRIVATE,/* a variable private to current function/module */
49 /* function private overrides module private, usual scoping
50 rules */
51 VRK_GLOBAL, /* in globals of a function */
52 VRK_LET, /* local let variable in a function decl */
53 VRK_PARAM, /* formal parameters of a function/claim */
54 VRK_QUANT /* bound by a quantifier */
28bf4b0b 55} varKind;
885824d3 56
28bf4b0b 57typedef struct {
885824d3 58 ltoken id;
59 sort sort;
60 varKind kind;
61 bool export; /* if TRUE, export it from this module */
62} *varInfo;
63
64/* The same lsymbol can originate from different files:
65 an LCL file or an LSL file. Each occurrence in an LCL file appears
66 as one of {opId, anyOp, logicalOp, simpleOp, eqOp, MULOP} ltoken.
67 Each occurrence in an LSL file appears as an lslOp AST. */
68
28bf4b0b 69typedef struct {
885824d3 70 /*@only@*/ nameNode name;
71 /*@only@*/ sigNodeSet signatures;
72} *opInfo;
73
28bf4b0b 74typedef struct {
885824d3 75 ltoken id;
76 tagKind kind;
77 bool imported;
78 sort sort;
79 /*@reldef@*/ union
80 {
81 /*@null@*/ /*@dependent@*/ ltokenList enums;
82 /*@null@*/ stDeclNodeList decls;
83 } content;
84} *tagInfo;
85
86typedef enum {
87 IK_SORT, IK_OP, IK_TAG
88 } infoKind;
89
90typedef struct {
91 infoKind kind;
92 union {
93 tagInfo tag;
94 sort sort;
95 opInfo op;} content;
96} htData;
97
98typedef enum {
99 SPE_GLOBAL, SPE_FCN, SPE_QUANT, SPE_CLAIM,
100 SPE_ABSTRACT, SPE_INVALID
101 } scopeKind;
102
28bf4b0b 103typedef struct {
885824d3 104 scopeKind kind;
105} *scopeInfo;
106
107/*
108** A simple hash table implementation: Given a key K and a
109** pointer P to a piece of data, associate K with P.
110**
111** Assumes that K is unsigned int, and data supports
112** 3 operations:
113** data_key: htData * -> unsigned int
114*/
115
28bf4b0b 116typedef struct s_htEntry {
885824d3 117 /*@only@*/ htData *data;
28bf4b0b 118 /*@only@*/ struct s_htEntry *next;
885824d3 119} htEntry;
120
121/* Each bucket is a linked list of entries */
122
123typedef htEntry bucket;
124typedef /*@relnull@*/ /*@only@*/ bucket *o_bucket;
125
126typedef struct {
127 unsigned int count;
128 unsigned int size;
129 /*@relnull@*/ /*@only@*/ o_bucket *buckets;
130} symHashTable;
131
132/* Local to implementation */
133
28bf4b0b 134typedef struct s_symtableStruct *symtable;
885824d3 135
0e41eb0e 136extern /*@falsewhennull@*/ bool typeInfo_exists(/*@null@*/ typeInfo p_ti);
885824d3 137# define typeInfo_exists(ti) ((ti) != NULL)
138
0e41eb0e 139extern /*@falsewhennull@*/ bool varInfo_exists(/*@null@*/ varInfo p_vi);
885824d3 140# define varInfo_exists(vi) ((vi) != NULL)
141
0e41eb0e 142extern /*@falsewhennull@*/ bool tagInfo_exists(/*@null@*/ tagInfo p_oi);
885824d3 143# define tagInfo_exists(ti) ((ti) != NULL)
144
0e41eb0e 145extern /*@falsewhennull@*/ bool opInfo_exists(/*@null@*/ opInfo p_oi);
885824d3 146# define opInfo_exists(oi) ((oi) != NULL)
147
148extern /*@only@*/ symtable symtable_new (void) /*@*/ ;
149extern void symtable_enterScope (symtable p_stable, /*@keep@*/ scopeInfo p_si);
150extern void symtable_exitScope(symtable p_stable);
151
152extern bool symtable_enterFct (symtable p_stable, /*@only@*/ fctInfo p_fi);
153extern void symtable_enterType (symtable p_stable, /*@only@*/ typeInfo p_ti);
154
155/* not only --- it is copied! */
156extern bool symtable_enterVar (symtable p_stable, /*@temp@*/ varInfo p_vi);
157extern void symtable_enterOp (symtable p_st,
158 /*@only@*/ /*@notnull@*/ nameNode p_n,
159 /*@owned@*/ sigNode p_oi);
160extern bool symtable_enterTag (symtable p_st, /*@only@*/ tagInfo p_ti);
161extern bool symtable_enterTagForce(symtable p_st, /*@only@*/ tagInfo p_ti);
162
163extern bool symtable_exists(symtable p_stable, lsymbol p_i);
164
165extern /*@observer@*/ /*@null@*/ typeInfo symtable_typeInfo(symtable p_stable, lsymbol p_i);
166extern /*@observer@*/ /*@null@*/ varInfo symtable_varInfo(symtable p_stable, lsymbol p_i);
167extern /*@observer@*/ /*@null@*/ varInfo symtable_varInfoInScope(symtable p_stable, lsymbol p_id);
168extern /*@observer@*/ /*@null@*/ opInfo symtable_opInfo(symtable p_st,
169 /*@notnull@*/ nameNode p_n);
170extern /*@observer@*/ /*@null@*/ tagInfo symtable_tagInfo(symtable p_st, lsymbol p_i);
171
172extern void symtable_export(symtable p_stable, bool p_yesNo);
173extern void symtable_dump(symtable p_stable, FILE *p_f, bool p_lco);
174
28bf4b0b 175extern void symtable_import(inputStream p_imported, ltoken p_tok, mapping p_map);
885824d3 176
177extern /*@unused@*/ void symtable_printStats (symtable p_s);
178
179extern lsymbol lsymbol_sortFromType (symtable, lsymbol);
180extern cstring tagKind_unparse (tagKind p_k);
28bf4b0b 181extern lsymbol lsymbol_translateSort (mapping p_m, lsymbol p_s);
885824d3 182extern void varInfo_free (/*@only@*/ varInfo p_v);
183
184extern /*@only@*/ lslOpSet
185 symtable_opsWithLegalDomain (symtable p_tab, /*@temp@*/ /*@null@*/ nameNode p_n,
186 sortSetList p_argSorts, sort p_qual);
187extern /*@observer@*/ sigNodeSet
188 symtable_possibleOps (symtable p_tab, nameNode p_n);
189extern bool symtable_opExistsWithArity(symtable p_tab, nameNode p_n, int p_arity);
190
191extern void symtable_free (/*@only@*/ symtable p_stable);
192
193# else
194# error "Multiple include"
195# endif
196
This page took 0.087324 seconds and 5 git commands to generate.