1 /*-------------------------------------------------------------------------
2 SDCCsymt.h - Header file for Symbols table related structures and MACRO's.
3 Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998)
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 In other words, you are welcome to use, share and improve this program.
20 You are forbidden to forbid anyone else to use, share and improve
21 what you give them. Help stamp out software-hoarding!
22 -------------------------------------------------------------------------*/
27 #define MAX_NEST_LEVEL 256
28 #define SDCC_NAME_MAX 64
29 #include "SDCChasht.h"
32 #define HASHTAB_SIZE 256
34 /* hash table bucket */
37 void *sym; /* pointer to the object */
38 char name[SDCC_NAME_MAX + 1]; /* name of this symbol */
39 int level; /* nest level for this symbol */
40 int block; /* belongs to which block */
41 struct bucket *prev; /* ptr 2 previous bucket */
42 struct bucket *next; /* ptr 2 next bucket */
46 typedef struct structdef
48 char tag[SDCC_NAME_MAX + 1]; /* tag part of structure */
49 unsigned char level; /* Nesting level */
50 struct symbol *fields; /* pointer to fields */
51 unsigned size; /* sizeof the table in bytes */
55 /* noun definitions */
91 /* specifier is the last in the type-chain */
92 typedef struct specifier
94 NOUN noun; /* CHAR INT STRUCTURE LABEL */
95 STORAGE_CLASS sclass; /* REGISTER,AUTO,FIX,CONSTANT */
96 struct memmap *oclass; /* output storage class */
97 unsigned _long:1; /* 1=long */
98 unsigned _short:1; /* 1=short int */
99 unsigned _unsigned:1; /* 1=unsigned, 0=signed */
100 unsigned _static:1; /* 1=static keyword found */
101 unsigned _extern:1; /* 1=extern found */
102 unsigned _absadr:1; /* absolute address specfied */
103 unsigned _reent:1; /* function is reentrant */
104 unsigned _intrtn:1; /* this is an interrupt routin */
105 unsigned _rbank:1; /* seperate register bank */
106 unsigned _volatile:1; /* is marked as volatile */
107 unsigned _const:1; /* is a constant */
108 unsigned _critical:1; /* critical function */
109 unsigned _typedef:1; /* is typedefed */
110 unsigned _isregparm:1; /* is the first parameter */
111 unsigned _isenum:1; /* is an enumerated type */
112 unsigned nonbanked:1; /* function has the nonbanked attribute */
113 unsigned banked:1; /* function has the banked attribute */
114 unsigned _IntNo; /* 1=Interrupt svc routine */
115 short _regbank; /* register bank 2b used */
116 unsigned _addr; /* address of symbol */
117 unsigned _stack; /* stack offset for stacked v */
118 unsigned _bitStart; /* bit start position */
119 int _bitLength; /* bit length */
122 { /* Values if constant or enum */
123 int v_int; /* int and char values */
124 char *v_char; /* character string */
125 unsigned v_uint; /* unsigned int const value */
126 long v_long; /* long constant value */
127 unsigned long v_ulong; /* unsigned long constant val */
128 double v_float; /* floating point constant value */
129 struct symbol *v_enum; /* ptr 2 enum_list if enum==1 */
132 struct structdef *v_struct; /* structure pointer */
136 /* types of declarators */
139 POINTER = 0, /* pointer to near data */
140 FPOINTER, /* pointer to far data */
141 CPOINTER, /* pointer to code space */
142 GPOINTER, /* _generic pointer */
143 PPOINTER, /* paged area pointer */
144 IPOINTER, /* pointer to upper 128 bytes */
145 UPOINTER, /* unknown pointer used only when parsing */
146 EEPPOINTER, /* pointer to eeprom */
152 typedef struct declarator
154 DECLARATOR_TYPE dcl_type; /* POINTER,ARRAY or FUNCTION */
155 unsigned int num_elem; /* # of elems if type==array */
156 short ptr_const:1; /* pointer is constant */
157 short ptr_volatile:1; /* pointer is volatile */
158 struct sym_link *tspec; /* pointer type specifier */
165 typedef struct sym_link
167 unsigned class:1; /* DECLARATOR or SPECIFIER */
168 unsigned tdef:1; /* current link created by */
169 /* typedef if this flag is set */
172 specifier s; /* if CLASS == SPECIFIER */
173 declarator d; /* if CLASS == DECLARATOR */
177 struct sym_link *next; /* next element on the chain */
181 typedef struct symbol
183 char name[SDCC_NAME_MAX + 1]; /* Input Variable Name */
184 char rname[SDCC_NAME_MAX + 1]; /* internal name */
186 short level; /* declration lev,fld offset */
187 short block; /* sequential block # of defintion */
189 unsigned fbody:1; /* function body defined */
190 unsigned implicit:1; /* implicit flag */
191 unsigned undefined:1; /* undefined variable */
192 unsigned ret:1; /* return statement for a function */
193 unsigned hasVargs:1; /* has a variable argument list */
194 unsigned _isparm:1; /* is a parameter */
195 unsigned ismyparm:1; /* is parameter of the function being generated */
196 unsigned isitmp:1; /* is an intermediate temp */
197 unsigned islbl:1; /* is a temporary label */
198 unsigned isref:1; /* has been referenced */
199 unsigned isind:1; /* is a induction variable */
200 unsigned isinvariant:1; /* is a loop invariant */
201 unsigned isstrlit:1; /* is a string literal */
202 unsigned cdef:1; /* compiler defined symbol */
203 unsigned allocreq:1; /* allocation is required for this variable */
204 unsigned addrtaken:1; /* address of the symbol was taken */
205 unsigned isreqv:1; /* is the register quivalent of a symbol */
206 unsigned hasFcall:1; /* for functions does it call other functions */
207 unsigned calleeSave:1; /* for functions uses callee save paradigm */
208 unsigned udChked:1; /* use def checking has been already done */
210 /* following flags are used by the backend
211 for code generation and can be changed
212 if a better scheme for backend is thought of */
213 unsigned isLiveFcall:1; /* is live at or across a function call */
214 unsigned isspilt:1; /* has to be spilt */
215 unsigned remat:1; /* can be remateriazed */
216 unsigned isptr:1; /* is a pointer */
217 unsigned uptr:1; /* used as a pointer */
218 unsigned isFree:1; /* used by register allocator */
219 unsigned islocal:1; /* is a local variable */
220 unsigned blockSpil:1; /* spilt at block level */
221 unsigned remainSpil:1; /* spilt because not used in remainder */
222 unsigned stackSpil:1; /* has been spilt on temp stack location */
223 unsigned onStack:1; /* this symbol allocated on the stack */
224 unsigned iaccess:1; /* indirect access */
225 unsigned ruonly:1; /* used in return statement only */
226 unsigned spildir:1; /* spilt in direct space */
227 unsigned ptrreg:1; /* this symbol assigned to a ptr reg */
228 unsigned accuse; /* can be left in the accumulator
229 On the Z80 accuse is devided into
230 ACCUSE_A and ACCUSE_HL as the idea
234 int stack; /* offset on stack */
235 int xstack; /* offset on xternal stack */
236 short nRegs; /* number of registers required */
237 short regType; /* type of register required */
239 struct regs *regs[4]; /* can have at the most 4 registers */
240 struct asmop *aop; /* asmoperand for this symbol */
241 struct iCode *fuse; /* furthest use */
242 struct iCode *rematiCode; /* rematerialse with which instruction */
243 struct operand *reqv; /* register equivalent of a local variable */
246 struct symbol *spillLoc; /* register spil location */
247 struct set *itmpStack; /* symbols spilt @ this stack location */
250 short bitVar; /* this is a bit variable */
251 unsigned offset; /* offset from top if struct */
253 int lineDef; /* defined line number */
254 int lastLine; /* for functions the last line */
255 struct sym_link *type; /* 1st link to declator chain */
256 struct sym_link *etype; /* last link to declarator chn */
257 struct value *args; /* arguments if function */
258 struct symbol *next; /* crosslink to next symbol */
259 struct symbol *localof; /* local variable of which function */
260 struct initList *ival; /* ptr to initializer if any */
261 struct bitVect *defs; /* bit vector for definitions */
262 struct bitVect *uses; /* bit vector for uses */
263 struct bitVect *regsUsed; /* for functions registers used */
264 int liveFrom; /* live from iCode sequence number */
265 int liveTo; /* live to sequence number */
266 int used; /* no. of times this was used */
267 int recvSize; /* size of first argument */
271 /* Easy Access Macros */
272 #define DCL_TYPE(l) l->select.d.dcl_type
273 #define DCL_ELEM(l) l->select.d.num_elem
274 #define DCL_PTR_CONST(l) l->select.d.ptr_const
275 #define DCL_PTR_VOLATILE(l) l->select.d.ptr_volatile
276 #define DCL_TSPEC(l) l->select.d.tspec
277 #define SPEC_NOUN(x) x->select.s.noun
278 #define SPEC_LONG(x) x->select.s._long
279 #define SPEC_SHORT(x) x->select.s._short
280 #define SPEC_USIGN(x) x->select.s._unsigned
281 #define SPEC_SCLS(x) x->select.s.sclass
282 #define SPEC_ENUM(x) x->select.s._isenum
283 #define SPEC_OCLS(x) x->select.s.oclass
284 #define SPEC_STAT(x) x->select.s._static
285 #define SPEC_EXTR(x) x->select.s._extern
286 #define SPEC_CODE(x) x->select.s._codesg
287 #define SPEC_RENT(x) x->select.s._reent
288 #define SPEC_INTN(x) x->select.s._IntNo
289 #define SPEC_ABSA(x) x->select.s._absadr
290 #define SPEC_BANK(x) x->select.s._regbank
291 #define SPEC_ADDR(x) x->select.s._addr
292 #define SPEC_STAK(x) x->select.s._stack
293 #define SPEC_CVAL(x) x->select.s.const_val
294 #define SPEC_BSTR(x) x->select.s._bitStart
295 #define SPEC_BLEN(x) x->select.s._bitLength
296 #define SPEC_BNKF(x) x->select.s._rbank
297 #define SPEC_INTRTN(x) x->select.s._intrtn
298 #define SPEC_CRTCL(x) x->select.s._critical
299 #define SPEC_VOLATILE(x) x->select.s._volatile
300 #define SPEC_CONST(x) x->select.s._const
301 #define SPEC_STRUCT(x) x->select.s.v_struct
302 #define SPEC_TYPEDEF(x) x->select.s._typedef
303 #define SPEC_REGPARM(x) x->select.s._isregparm
304 #define SPEC_NONBANKED(x) x->select.s.nonbanked
305 #define SPEC_BANKED(x) x->select.s.banked
307 /* type check macros */
308 #define IS_DECL(x) ( x && x->class == DECLARATOR )
309 #define IS_SPEC(x) ( x && x->class == SPECIFIER )
310 #define IS_ARRAY(x) (IS_DECL(x) && DCL_TYPE(x) == ARRAY)
311 #define IS_DATA_PTR(x) (IS_DECL(x) && DCL_TYPE(x) == POINTER)
312 #define IS_PTR(x) (IS_DECL(x) && (DCL_TYPE(x) == POINTER || \
313 DCL_TYPE(x) == FPOINTER || \
314 DCL_TYPE(x) == GPOINTER || \
315 DCL_TYPE(x) == IPOINTER || \
316 DCL_TYPE(x) == PPOINTER || \
317 DCL_TYPE(x) == EEPPOINTER || \
318 DCL_TYPE(x) == CPOINTER || \
319 DCL_TYPE(x) == UPOINTER ))
320 #define IS_PTR_CONST(x) (IS_PTR(x) && DCL_PTR_CONST(x))
321 #define IS_FARPTR(x) (IS_DECL(x) && DCL_TYPE(x) == FPOINTER)
322 #define IS_GENPTR(x) (IS_DECL(x) && DCL_TYPE(x) == GPOINTER)
323 #define IS_FUNC(x) (IS_DECL(x) && DCL_TYPE(x) == FUNCTION)
324 #define IS_LONG(x) (IS_SPEC(x) && x->select.s._long)
325 #define IS_SHORT(x) (IS_SPEC(x) && x->select.s._short)
326 #define IS_TYPEDEF(x)(IS_SPEC(x) && x->select.s._typedef)
327 #define IS_CONSTANT(x) (IS_SPEC(x) && ( x->select.s._const == 1))
328 #define IS_STRUCT(x) (IS_SPEC(x) && x->select.s.noun == V_STRUCT)
329 #define IS_ABSOLUTE(x) (IS_SPEC(x) && x->select.s._absadr )
330 #define IS_REGISTER(x) (IS_SPEC(x) && SPEC_SCLS(x) == S_REGISTER)
331 #define IS_RENT(x) (IS_SPEC(x) && x->select.s._reent )
332 #define IS_STATIC(x) (IS_SPEC(x) && SPEC_STAT(x))
333 #define IS_INT(x) (IS_SPEC(x) && x->select.s.noun == V_INT)
334 #define IS_VOID(x) (IS_SPEC(x) && x->select.s.noun == V_VOID)
335 #define IS_CHAR(x) (IS_SPEC(x) && x->select.s.noun == V_CHAR)
336 #define IS_EXTERN(x) (IS_SPEC(x) && x->select.s._extern)
337 #define IS_VOLATILE(x) (IS_SPEC(x) && x->select.s._volatile )
338 #define IS_INTEGRAL(x) (IS_SPEC(x) && (x->select.s.noun == V_INT || \
339 x->select.s.noun == V_CHAR || \
340 x->select.s.noun == V_BIT || \
341 x->select.s.noun == V_SBIT ))
342 #define IS_BITFIELD(x) (IS_SPEC(x) && (x->select.s.noun == V_BIT))
343 #define IS_BITVAR(x) (IS_SPEC(x) && (x->select.s.noun == V_BIT || \
344 x->select.s.noun == V_SBIT ))
345 #define IS_FLOAT(x) (IS_SPEC(x) && x->select.s.noun == V_FLOAT)
346 #define IS_ARITHMETIC(x) (IS_INTEGRAL(x) || IS_FLOAT(x))
347 #define IS_AGGREGATE(x) (IS_ARRAY(x) || IS_STRUCT(x))
348 #define IS_LITERAL(x) (IS_SPEC(x) && x->select.s.sclass == S_LITERAL)
349 #define IS_ISR(x) (IS_SPEC(x) && SPEC_INTRTN(x))
350 #define IS_REGPARM(x) (IS_SPEC(x) && SPEC_REGPARM(x))
351 #define IS_NONBANKED(x) (IS_SPEC(x) && SPEC_NONBANKED(x))
352 #define IS_BANKED(x) (IS_SPEC(x) && SPEC_BANKED(x))
353 #define IS_BANKEDCALL(x) (IS_SPEC(x) && !SPEC_NONBANKED(x) && !SPEC_STAT(x) && (options.model == MODEL_LARGE || options.model == MODEL_MEDIUM || SPEC_BANKED(x)))
355 /* forward declaration for the global vars */
356 extern bucket *SymbolTab[];
357 extern bucket *StructTab[];
358 extern bucket *TypedefTab[];
359 extern bucket *LabelTab[];
360 extern bucket *enumTab[];
361 extern symbol *__fsadd;
362 extern symbol *__fssub;
363 extern symbol *__fsmul;
364 extern symbol *__fsdiv;
365 extern symbol *__fseq;
366 extern symbol *__fsneq;
367 extern symbol *__fslt;
368 extern symbol *__fslteq;
369 extern symbol *__fsgt;
370 extern symbol *__fsgteq;
372 /* Dims: mul/div/mod, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
373 extern symbol *__muldiv[3][3][2];
374 /* Dims: BYTE/WORD/DWORD SIGNED/UNSIGNED */
375 extern sym_link *__multypes[3][2];
376 /* Dims: to/from float, BYTE/WORD/DWORD, SIGNED/USIGNED */
377 extern symbol *__conv[2][3][2];
379 #define CHARTYPE __multypes[0][0]
380 #define UCHARTYPE __multypes[0][1]
381 #define INTTYPE __multypes[1][0]
382 #define UINTTYPE __multypes[1][1]
383 #define LONGTYPE __multypes[2][0]
384 #define ULONGTYPE __multypes[2][1]
387 extern sym_link *floatType;
391 /* forward definitions for the symbol table related functions */
393 symbol *newSymbol (char *, int);
394 sym_link *newLink ();
395 sym_link *newFloatLink ();
396 structdef *newStruct (char *);
397 void addDecl (symbol *, int, sym_link *);
398 sym_link *mergeSpec (sym_link *, sym_link *);
399 sym_link *cloneSpec (sym_link *);
400 symbol *reverseSyms (symbol *);
401 sym_link *reverseLink (sym_link *);
402 symbol *copySymbol (symbol *);
403 symbol *copySymbolChain (symbol *);
404 void printSymChain (symbol *, int);
405 void printStruct (structdef *, int);
406 char *genSymName (int);
407 sym_link *getSpec (sym_link *);
408 char *genSymName (int);
409 int compStructSize (int, structdef *);
410 sym_link *copyLinkChain (sym_link *);
411 int checkDecl (symbol *);
412 void checkBasic (sym_link *, sym_link *);
413 value *checkPointerIval (sym_link *, value *);
414 value *checkStructIval (symbol *, value *);
415 value *checkArrayIval (sym_link *, value *);
416 value *checkIval (sym_link *, value *);
417 unsigned int getSize (sym_link *);
418 unsigned int bitsForType (sym_link *);
419 sym_link *newIntLink ();
420 sym_link *newCharLink ();
421 sym_link *newLongLink ();
422 int checkType (sym_link *, sym_link *);
423 int checkFunction (symbol *);
424 void cleanUpLevel (bucket **, int);
425 void cleanUpBlock (bucket **, int);
426 int funcInChain (sym_link *);
427 void addSymChain (symbol *);
428 sym_link *structElemType (sym_link *, value *, value **);
429 symbol *getStructElement (structdef *, symbol *);
430 sym_link *computeType (sym_link *, sym_link *);
431 void processFuncArgs (symbol *, int);
432 int isSymbolEqual (symbol *, symbol *);
433 int powof2 (unsigned long);
434 void printTypeChain (sym_link *, FILE *);
435 void initCSupport ();
436 void pointerTypes (sym_link *, sym_link *);
437 void cdbTypeInfo (sym_link *, FILE *);
438 void cdbSymbol (symbol *, FILE *, int, int);
439 void cdbStructBlock (int, FILE *);
441 bucket *newBucket ();
442 void addSym (bucket **, void *, char *, int, int);
443 void deleteSym (bucket **, void *, char *);
444 void *findSym (bucket **, void *, const char *);
445 void *findSymWithLevel (bucket **, struct symbol *);
446 void *findSymWithBlock (bucket **, struct symbol *, int);