cc2.h - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
cc2.h (6688B)
---
1 #define ASLABEL 0
2
3 #ifdef NDEBUG
4 #define PRCFG(msg)
5 #define PRTREE(msg)
6 #else
7 #define PRCFG(msg) (enadebug ? prcfg(msg) : NULL)
8 #define PRTREE(msg) (enadebug ? prforest(msg) : NULL)
9 #endif
10
11 enum iflags {
12 BBENTRY = 1, /* basic block entry */
13 BBEXIT = 2, /* basic block exit */
14 };
15
16 enum tflags {
17 SIGNF = 1 << 0, /* Signed type */
18 INTF = 1 << 1, /* integer type */
19 FLOATF = 1 << 2, /* float type */
20 STRF = 1 << 3, /* string */
21 AGGRF = 1 << 4, /* aggregate */
22 FUNF = 1 << 5, /* function */
23 PARF = 1 << 6, /* parameter */
24 INITF = 1 << 7, /* initializer flag */
25 ELLIPS = 1 << 8, /* vararg function */
26 ARRF = 1 << 9, /* array flag */
27 PTRF = 1 << 10, /* pointer flag */
28 };
29
30 enum sclass {
31 SAUTO = 'A',
32 SREG = 'R',
33 SLABEL = 'L',
34 SINDEX = 'I',
35 STMP = 'N',
36 SGLOB = 'G',
37 SEXTRN = 'X',
38 SPRIV = 'Y',
39 SLOCAL = 'T',
40 SMEMB = 'M',
41 SCONST = '#',
42 STRING = '"',
43 SNONE = 0 /* cc2 relies on SNONE being 0 in nextpc() */
44 };
45
46 enum types {
47 ELLIPSIS = 'E',
48 INT8 = 'C',
49 INT16 = 'I',
50 INT32 = 'W',
51 INT64 = 'Q',
52 UINT8 = 'K',
53 UINT16 = 'N',
54 UINT32 = 'Z',
55 UINT64 = 'O',
56 POINTER = 'P',
57 FUNCTION = 'F',
58 VECTOR = 'V',
59 UNION = 'U',
60 STRUCT = 'S',
61 BOOL = 'B',
62 FLOAT = 'J',
63 DOUBLE = 'D',
64 LDOUBLE = 'H',
65 VOID = '0'
66 };
67
68 enum op {
69 /* kind of operand */
70 /* operands */
71 OMEM = 'M',
72 OINDEX = 'I',
73 OTMP = 'N',
74 OAUTO = 'A',
75 OREG = 'R',
76 OMREG = 'G',
77 OCONST = '#',
78 OSTRING = '"',
79 OLOAD = 'D',
80 OLABEL = 'L',
81 OADD = '+',
82 OSUB = '-',
83 OMUL = '*',
84 OMOD = '%',
85 ODIV = '/',
86 OSHL = 'l',
87 OSHR = 'r',
88 OLT = '<',
89 OGT = '>',
90 OLE = '[',
91 OGE = ']',
92 OEQ = '=',
93 ONE = '!',
94 OBAND = '&',
95 OBOR = '|',
96 OBXOR = '^',
97 OCPL = '~',
98 OASSIG = ':',
99 OSNEG = '_',
100 OCALL = 'c',
101 OCALLE = 'z',
102 OPAR = 'p',
103 OFIELD = '.',
104 OCOMMA = ',',
105 OASK = '?',
106 OCOLON = ' ',
107 OADDR = '\'',
108 OAND = 'a',
109 OOR = 'o',
110 ONEG = 'n',
111 OPTR = '@',
112 OCAST = 'g',
113 OINC = 'i',
114 ODEC = 'd',
115 OBUILTIN = 'm',
116 /*statements */
117 ONOP = 'q',
118 OJMP = 'j',
119 OBRANCH = 'y',
120 ORET = 'h',
121 OBLOOP = 'b',
122 OELOOP = 'e',
123 OCASE = 'v',
124 ODEFAULT = 'f',
125 OBSWITCH = 's',
126 OESWITCH = 't',
127 OBFUN = 'x',
128 OEFUN = 'k',
129 };
130
131 enum builtins {
132 BVA_START = 's',
133 BVA_END = 'e',
134 BVA_ARG = 'a',
135 BVA_COPY = 'c',
136 };
137
138 enum nerrors {
139 EEOFFUN, /* EOF while parsing function */
140 ENLABEL, /* label without statement */
141 EIDOVER, /* identifier overflow */
142 EOUTPAR, /* out pf params */
143 ESYNTAX, /* syntax error */
144 ESTACKA, /* stack unaligned */
145 ESTACKO, /* stack overflow */
146 ESTACKU, /* stack underflow */
147 ELNLINE, /* line too long */
148 ELNBLNE, /* line without new line */
149 EFERROR, /* error reading from file:%s */
150 EBADID, /* incorrect symbol id */
151 EWTACKO, /* switch stack overflow */
152 EWTACKU, /* switch stack underflow */
153 ENOSWTC, /* Out of switch statement */
154 EBBUILT, /* Unknown builtin */
155 EOVERFL, /* Numerical overflow */
156 EBAFFUN, /* Function body not finished */
157 ENUMERR
158 };
159
160 typedef struct node Node;
161 typedef struct type Type;
162 typedef struct symbol Symbol;
163 typedef struct addr Addr;
164 typedef struct inst Inst;
165 typedef struct block Block;
166 typedef struct swtch Swtch;
167 typedef struct mach Mach;
168
169 struct mach {
170 int swtchif;
171 };
172
173 struct swtch {
174 int nr;
175 TINT min, max;
176 Node *bswtch;
177 Node *eswtch;
178 Node **cases;
179 Node *defnode;
180
181 Swtch *next;
182 };
183
184 struct type {
185 unsigned long size;
186 unsigned align;
187 unsigned short id;
188 unsigned short flags;
189 };
190
191 struct symbol {
192 Type type;
193 Type rtype;
194 unsigned short id;
195 unsigned short numid;
196 int refcnt;
197 char *name;
198 char kind;
199 union {
200 long off;
201 Node *stmt;
202 Inst *inst;
203 } u;
204 Symbol *next, *prev;
205 Symbol *h_next;
206 };
207
208 struct node {
209 char op;
210 Type type;
211 int complex;
212 int address;
213 unsigned flags;
214 union {
215 TUINT i;
216 TFLOAT f;
217 char *s;
218 Symbol *sym;
219 Swtch *swtch;
220 int reg;
221 int subop;
222 long off;
223 } u;
224 Symbol *label;
225 Block *bb;
226 Node *left, *right;
227 Node *next, *prev;
228 };
229
230 struct block {
231 int id;
232 int printed, visited;
233 Node *entryp, *exitp;
234 Block *true, *false;
235 Swtch *swtch;
236 Block *next;
237 };
238
239 struct addr {
240 char kind;
241 union {
242 int reg;
243 TUINT i;
244 Symbol *sym;
245 long off;
246 } u;
247 };
248
249 struct inst {
250 unsigned char op;
251 unsigned char flags;
252 Symbol *label;
253 Inst *next, *prev;
254 Addr from1, from2, to;
255 };
256
257 /* main.c */
258 extern void error(unsigned nerror, ...);
259
260 /* parse.c */
261 extern void parse(void);
262
263 /* cgen.c */
264 extern void genaddr(void);
265 extern void genasm(void);
266 extern Node *tsethi(Node *);
267
268 /* peep.c */
269 extern void peephole(void);
270
271 /* code.c */
272 extern void data(Node *np);
273 extern void writeout(void), endinit(void);
274 extern void code(int op, Node *to, Node *from1, Node *from2);
275 extern void defvar(Symbol *), defpar(Symbol *), defglobal(Symbol *);
276 extern void setlabel(Symbol *);
277 extern Node *label2node(Node *np, Symbol *sym);
278 extern Node *constnode(Node *np, TUINT n, Type *tp);
279 extern Node *tmpnode(Type *, Symbol *);
280 extern Node *idxnode(Node *, long);
281 extern void delcode(void);
282 extern Symbol *newlabel(void);
283 extern void pprint(char *s);
284 extern void deftype(Type *);
285 extern Node *labelstmt(Node *, Symbol *);
286
287 /* node.c */
288 extern void newfun(Symbol *, Node *);
289 extern void apply(Node *(*fun)(Node *));
290 extern void cleannodes(void);
291 extern void delnode(Node *np);
292 extern void deltree(Node *np);
293 extern void prtree(Node *np), prforest(char *msg);
294 extern Node *node(int op);
295 extern Node *addstmt(Node *);
296 extern Node *delstmt(Node *);
297 extern Node *insstmt(Node *, Node *);
298 extern Node *prestmt(Node *);
299 extern void delrange(Node *, Node *);
300 extern Node *unlinkstmt(Node *);
301
302 /* symbol.c */
303 #define TMPSYM 0
304 extern Symbol *getsym(unsigned id);
305 extern void popctx(void);
306 extern void pushctx(void);
307 extern void freesym(Symbol *sym);
308
309 /* cfg.c */
310 extern void gencfg(void);
311 extern void cleancfg(void);
312 extern Node *sethi(Node *);
313
314 /* swtch.c */
315 extern void cleanswtch(void);
316 extern Swtch *newswtch(Swtch *);
317 extern Node *swtch(Node *);
318 extern Node *swtchdefault(Swtch *);
319
320 /* globals */
321 extern Symbol *curfun;
322 extern Symbol *locals;
323 extern Inst *pc, *prog;
324 extern Node *laststmt;
325 extern Mach mach;
326
327 /* target */
328 extern Type int8type, int16type, int32type, int64type,
329 uint8type, uint16type, uint32type, uint64type,
330 float32type, float64type, float80type,
331 booltype,
332 ptrtype,
333 voidtype,
334 arg_type;