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 _signed:1; /* just for sanity checks only*/
101 unsigned _static:1; /* 1=static keyword found */
102 unsigned _extern:1; /* 1=extern found */
103 unsigned _absadr:1; /* absolute address specfied */
104 unsigned _reent:1; /* function is reentrant */
105 unsigned _intrtn:1; /* this is an interrupt routin */
106 unsigned _rbank:1; /* seperate register bank */
107 unsigned _volatile:1; /* is marked as volatile */
108 unsigned _const:1; /* is a constant */
109 unsigned _critical:1; /* critical function */
110 unsigned _naked:1; /* naked function */
111 unsigned _typedef:1; /* is typedefed */
112 unsigned _isregparm:1; /* is the first parameter */
113 unsigned _isenum:1; /* is an enumerated type */
114 unsigned nonbanked:1; /* function has the nonbanked attribute */
115 unsigned banked:1; /* function has the banked attribute */
116 unsigned _IntNo; /* 1=Interrupt svc routine */
117 short _regbank; /* register bank 2b used */
118 unsigned _addr; /* address of symbol */
119 unsigned _stack; /* stack offset for stacked v */
120 unsigned _bitStart; /* bit start position */
121 int _bitLength; /* bit length */
124 { /* Values if constant or enum */
125 int v_int; /* int and char values */
126 char *v_char; /* character string */
127 unsigned v_uint; /* unsigned int const value */
128 long v_long; /* long constant value */
129 unsigned long v_ulong; /* unsigned long constant val */
130 double v_float; /* floating point constant value */
131 struct symbol *v_enum; /* ptr 2 enum_list if enum==1 */
134 struct structdef *v_struct; /* structure pointer */
138 /* types of declarators */
141 POINTER = 0, /* pointer to near data */
142 FPOINTER, /* pointer to far data */
143 CPOINTER, /* pointer to code space */
144 GPOINTER, /* _generic pointer */
145 PPOINTER, /* paged area pointer */
146 IPOINTER, /* pointer to upper 128 bytes */
147 UPOINTER, /* unknown pointer used only when parsing */
148 EEPPOINTER, /* pointer to eeprom */
154 typedef struct declarator
156 DECLARATOR_TYPE dcl_type; /* POINTER,ARRAY or FUNCTION */
157 unsigned int num_elem; /* # of elems if type==array */
158 short ptr_const:1; /* pointer is constant */
159 short ptr_volatile:1; /* pointer is volatile */
160 struct sym_link *tspec; /* pointer type specifier */
167 typedef struct sym_link
169 unsigned class:1; /* DECLARATOR or SPECIFIER */
170 unsigned tdef:1; /* current link created by */
171 /* typedef if this flag is set */
174 specifier s; /* if CLASS == SPECIFIER */
175 declarator d; /* if CLASS == DECLARATOR */
179 struct sym_link *next; /* next element on the chain */
183 typedef struct symbol
185 char name[SDCC_NAME_MAX + 1]; /* Input Variable Name */
186 char rname[SDCC_NAME_MAX + 1]; /* internal name */
188 short level; /* declration lev,fld offset */
189 short block; /* sequential block # of defintion */
191 unsigned fbody:1; /* function body defined */
192 unsigned implicit:1; /* implicit flag */
193 unsigned undefined:1; /* undefined variable */
194 unsigned ret:1; /* return statement for a function */
195 unsigned hasVargs:1; /* has a variable argument list */
196 unsigned _isparm:1; /* is a parameter */
197 unsigned ismyparm:1; /* is parameter of the function being generated */
198 unsigned isitmp:1; /* is an intermediate temp */
199 unsigned islbl:1; /* is a temporary label */
200 unsigned isref:1; /* has been referenced */
201 unsigned isind:1; /* is a induction variable */
202 unsigned isinvariant:1; /* is a loop invariant */
203 unsigned isstrlit:1; /* is a string literal */
204 unsigned cdef:1; /* compiler defined symbol */
205 unsigned allocreq:1; /* allocation is required for this variable */
206 unsigned addrtaken:1; /* address of the symbol was taken */
207 unsigned isreqv:1; /* is the register quivalent of a symbol */
208 unsigned hasFcall:1; /* for functions does it call other functions */
209 unsigned calleeSave:1; /* for functions uses callee save paradigm */
210 unsigned udChked:1; /* use def checking has been already done */
212 /* following flags are used by the backend
213 for code generation and can be changed
214 if a better scheme for backend is thought of */
215 unsigned isLiveFcall:1; /* is live at or across a function call */
216 unsigned isspilt:1; /* has to be spilt */
217 unsigned remat:1; /* can be remateriazed */
218 unsigned isptr:1; /* is a pointer */
219 unsigned uptr:1; /* used as a pointer */
220 unsigned isFree:1; /* used by register allocator */
221 unsigned islocal:1; /* is a local variable */
222 unsigned blockSpil:1; /* spilt at block level */
223 unsigned remainSpil:1; /* spilt because not used in remainder */
224 unsigned stackSpil:1; /* has been spilt on temp stack location */
225 unsigned onStack:1; /* this symbol allocated on the stack */
226 unsigned iaccess:1; /* indirect access */
227 unsigned ruonly:1; /* used in return statement only */
228 unsigned spildir:1; /* spilt in direct space */
229 unsigned ptrreg:1; /* this symbol assigned to a ptr reg */
230 unsigned noSpilLoc:1; /* cannot be assigned a spil location */
231 unsigned accuse; /* can be left in the accumulator
232 On the Z80 accuse is devided into
233 ACCUSE_A and ACCUSE_HL as the idea
237 int stack; /* offset on stack */
238 int xstack; /* offset on xternal stack */
239 short nRegs; /* number of registers required */
240 short regType; /* type of register required */
242 struct regs *regs[4]; /* can have at the most 4 registers */
243 struct asmop *aop; /* asmoperand for this symbol */
244 struct iCode *fuse; /* furthest use */
245 struct iCode *rematiCode; /* rematerialse with which instruction */
246 struct operand *reqv; /* register equivalent of a local variable */
249 struct symbol *spillLoc; /* register spil location */
250 struct set *itmpStack; /* symbols spilt @ this stack location */
253 short bitVar; /* this is a bit variable */
254 unsigned offset; /* offset from top if struct */
256 int lineDef; /* defined line number */
257 int lastLine; /* for functions the last line */
258 struct sym_link *type; /* 1st link to declator chain */
259 struct sym_link *etype; /* last link to declarator chn */
260 struct value *args; /* arguments if function */
261 struct symbol *next; /* crosslink to next symbol */
262 struct symbol *localof; /* local variable of which function */
263 struct initList *ival; /* ptr to initializer if any */
264 struct bitVect *defs; /* bit vector for definitions */
265 struct bitVect *uses; /* bit vector for uses */
266 struct bitVect *regsUsed; /* for functions registers used */
267 int liveFrom; /* live from iCode sequence number */
268 int liveTo; /* live to sequence number */
269 int used; /* no. of times this was used */
270 int recvSize; /* size of first argument */
274 /* Easy Access Macros */
275 #define DCL_TYPE(l) l->select.d.dcl_type
276 #define DCL_ELEM(l) l->select.d.num_elem
277 #define DCL_PTR_CONST(l) l->select.d.ptr_const
278 #define DCL_PTR_VOLATILE(l) l->select.d.ptr_volatile
279 #define DCL_TSPEC(l) l->select.d.tspec
280 #define SPEC_NOUN(x) x->select.s.noun
281 #define SPEC_LONG(x) x->select.s._long
282 #define SPEC_USIGN(x) x->select.s._unsigned
283 #define SPEC_SCLS(x) x->select.s.sclass
284 #define SPEC_ENUM(x) x->select.s._isenum
285 #define SPEC_OCLS(x) x->select.s.oclass
286 #define SPEC_STAT(x) x->select.s._static
287 #define SPEC_EXTR(x) x->select.s._extern
288 #define SPEC_CODE(x) x->select.s._codesg
289 #define SPEC_RENT(x) x->select.s._reent
290 #define SPEC_INTN(x) x->select.s._IntNo
291 #define SPEC_ABSA(x) x->select.s._absadr
292 #define SPEC_BANK(x) x->select.s._regbank
293 #define SPEC_ADDR(x) x->select.s._addr
294 #define SPEC_STAK(x) x->select.s._stack
295 #define SPEC_CVAL(x) x->select.s.const_val
296 #define SPEC_BSTR(x) x->select.s._bitStart
297 #define SPEC_BLEN(x) x->select.s._bitLength
299 /* Sleaze: SPEC_ISR_SAVED_BANKS is only used on
300 * function type symbols, which obviously cannot
301 * be of BIT type. Therefore, we recycle the
302 * _bitStart field instead of defining a new field.
304 #define SPEC_ISR_SAVED_BANKS(x) x->select.s._bitStart
305 #define SPEC_BNKF(x) x->select.s._rbank
306 #define SPEC_INTRTN(x) x->select.s._intrtn
307 #define SPEC_CRTCL(x) x->select.s._critical
308 #define SPEC_NAKED(x) x->select.s._naked
309 #define SPEC_VOLATILE(x) x->select.s._volatile
310 #define SPEC_CONST(x) x->select.s._const
311 #define SPEC_STRUCT(x) x->select.s.v_struct
312 #define SPEC_TYPEDEF(x) x->select.s._typedef
313 #define SPEC_REGPARM(x) x->select.s._isregparm
314 #define SPEC_NONBANKED(x) x->select.s.nonbanked
315 #define SPEC_BANKED(x) x->select.s.banked
317 /* type check macros */
318 #define IS_DECL(x) ( x && x->class == DECLARATOR )
319 #define IS_SPEC(x) ( x && x->class == SPECIFIER )
320 #define IS_ARRAY(x) (IS_DECL(x) && DCL_TYPE(x) == ARRAY)
321 #define IS_DATA_PTR(x) (IS_DECL(x) && DCL_TYPE(x) == POINTER)
322 #define IS_PTR(x) (IS_DECL(x) && (DCL_TYPE(x) == POINTER || \
323 DCL_TYPE(x) == FPOINTER || \
324 DCL_TYPE(x) == GPOINTER || \
325 DCL_TYPE(x) == IPOINTER || \
326 DCL_TYPE(x) == PPOINTER || \
327 DCL_TYPE(x) == EEPPOINTER || \
328 DCL_TYPE(x) == CPOINTER || \
329 DCL_TYPE(x) == UPOINTER ))
330 #define IS_PTR_CONST(x) (IS_PTR(x) && DCL_PTR_CONST(x))
331 #define IS_FARPTR(x) (IS_DECL(x) && DCL_TYPE(x) == FPOINTER)
332 #define IS_GENPTR(x) (IS_DECL(x) && DCL_TYPE(x) == GPOINTER)
333 #define IS_FUNC(x) (IS_DECL(x) && DCL_TYPE(x) == FUNCTION)
334 #define IS_LONG(x) (IS_SPEC(x) && x->select.s._long)
335 #define IS_TYPEDEF(x)(IS_SPEC(x) && x->select.s._typedef)
336 #define IS_CONSTANT(x) (IS_SPEC(x) && ( x->select.s._const == 1))
337 #define IS_STRUCT(x) (IS_SPEC(x) && x->select.s.noun == V_STRUCT)
338 #define IS_ABSOLUTE(x) (IS_SPEC(x) && x->select.s._absadr )
339 #define IS_REGISTER(x) (IS_SPEC(x) && SPEC_SCLS(x) == S_REGISTER)
340 #define IS_RENT(x) (IS_SPEC(x) && x->select.s._reent )
341 #define IS_STATIC(x) (IS_SPEC(x) && SPEC_STAT(x))
342 #define IS_INT(x) (IS_SPEC(x) && x->select.s.noun == V_INT)
343 #define IS_VOID(x) (IS_SPEC(x) && x->select.s.noun == V_VOID)
344 #define IS_CHAR(x) (IS_SPEC(x) && x->select.s.noun == V_CHAR)
345 #define IS_EXTERN(x) (IS_SPEC(x) && x->select.s._extern)
346 #define IS_VOLATILE(x) (IS_SPEC(x) && x->select.s._volatile )
347 #define IS_INTEGRAL(x) (IS_SPEC(x) && (x->select.s.noun == V_INT || \
348 x->select.s.noun == V_CHAR || \
349 x->select.s.noun == V_BIT || \
350 x->select.s.noun == V_SBIT ))
351 #define IS_BITFIELD(x) (IS_SPEC(x) && (x->select.s.noun == V_BIT))
352 #define IS_BITVAR(x) (IS_SPEC(x) && (x->select.s.noun == V_BIT || \
353 x->select.s.noun == V_SBIT ))
354 #define IS_FLOAT(x) (IS_SPEC(x) && x->select.s.noun == V_FLOAT)
355 #define IS_ARITHMETIC(x) (IS_INTEGRAL(x) || IS_FLOAT(x))
356 #define IS_AGGREGATE(x) (IS_ARRAY(x) || IS_STRUCT(x))
357 #define IS_LITERAL(x) (IS_SPEC(x) && x->select.s.sclass == S_LITERAL)
358 #define IS_ISR(x) (IS_SPEC(x) && SPEC_INTRTN(x))
359 #define IS_REGPARM(x) (IS_SPEC(x) && SPEC_REGPARM(x))
360 #define IS_NONBANKED(x) (IS_SPEC(x) && SPEC_NONBANKED(x))
361 #define IS_BANKED(x) (IS_SPEC(x) && SPEC_BANKED(x))
362 #define IS_BANKEDCALL(x) (IS_SPEC(x) && !SPEC_NONBANKED(x) && !SPEC_STAT(x) && (options.model == MODEL_LARGE || options.model == MODEL_MEDIUM || SPEC_BANKED(x)))
364 /* forward declaration for the global vars */
365 extern bucket *SymbolTab[];
366 extern bucket *StructTab[];
367 extern bucket *TypedefTab[];
368 extern bucket *LabelTab[];
369 extern bucket *enumTab[];
370 extern symbol *__fsadd;
371 extern symbol *__fssub;
372 extern symbol *__fsmul;
373 extern symbol *__fsdiv;
374 extern symbol *__fseq;
375 extern symbol *__fsneq;
376 extern symbol *__fslt;
377 extern symbol *__fslteq;
378 extern symbol *__fsgt;
379 extern symbol *__fsgteq;
381 /* Dims: mul/div/mod, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
382 extern symbol *__muldiv[3][3][2];
383 /* Dims: BYTE/WORD/DWORD SIGNED/UNSIGNED */
384 extern sym_link *__multypes[3][2];
385 /* Dims: to/from float, BYTE/WORD/DWORD, SIGNED/USIGNED */
386 extern symbol *__conv[2][3][2];
387 /* Dims: shift left/shift right, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
388 symbol *__rlrr[2][3][2];
390 #define CHARTYPE __multypes[0][0]
391 #define UCHARTYPE __multypes[0][1]
392 #define INTTYPE __multypes[1][0]
393 #define UINTTYPE __multypes[1][1]
394 #define LONGTYPE __multypes[2][0]
395 #define ULONGTYPE __multypes[2][1]
398 extern sym_link *floatType;
402 /* forward definitions for the symbol table related functions */
404 symbol *newSymbol (char *, int);
405 sym_link *newLink ();
406 sym_link *newFloatLink ();
407 structdef *newStruct (char *);
408 void addDecl (symbol *, int, sym_link *);
409 sym_link *mergeSpec (sym_link *, sym_link *, char *name);
410 sym_link *cloneSpec (sym_link *);
411 symbol *reverseSyms (symbol *);
412 sym_link *reverseLink (sym_link *);
413 symbol *copySymbol (symbol *);
414 symbol *copySymbolChain (symbol *);
415 void printSymChain (symbol *, int);
416 void printStruct (structdef *, int);
417 char *genSymName (int);
418 sym_link *getSpec (sym_link *);
419 char *genSymName (int);
420 int compStructSize (int, structdef *);
421 sym_link *copyLinkChain (sym_link *);
422 int checkDecl (symbol *);
423 void checkBasic (sym_link *, sym_link *);
424 value *checkPointerIval (sym_link *, value *);
425 value *checkStructIval (symbol *, value *);
426 value *checkArrayIval (sym_link *, value *);
427 value *checkIval (sym_link *, value *);
428 unsigned int getSize (sym_link *);
429 unsigned int bitsForType (sym_link *);
430 sym_link *newIntLink ();
431 sym_link *newCharLink ();
432 sym_link *newLongLink ();
433 int compareType (sym_link *, sym_link *);
434 int checkFunction (symbol *);
435 void cleanUpLevel (bucket **, int);
436 void cleanUpBlock (bucket **, int);
437 int funcInChain (sym_link *);
438 void addSymChain (symbol *);
439 sym_link *structElemType (sym_link *, value *, value **);
440 symbol *getStructElement (structdef *, symbol *);
441 sym_link *computeType (sym_link *, sym_link *);
442 void processFuncArgs (symbol *, int);
443 int isSymbolEqual (symbol *, symbol *);
444 int powof2 (unsigned long);
445 void printTypeChain (sym_link *, FILE *);
446 void initCSupport ();
447 void pointerTypes (sym_link *, sym_link *);
448 void cdbTypeInfo (sym_link *, FILE *);
449 void cdbSymbol (symbol *, FILE *, int, int);
450 void cdbStructBlock (int, FILE *);
452 bucket *newBucket ();
453 void addSym (bucket **, void *, char *, int, int, int checkType);
454 void deleteSym (bucket **, void *, char *);
455 void *findSym (bucket **, void *, const char *);
456 void *findSymWithLevel (bucket **, struct symbol *);
457 void *findSymWithBlock (bucket **, struct symbol *, int);
458 void changePointer (symbol * sym);
459 void checkTypeSanity(sym_link *etype, char *name);
461 extern char *nounName(sym_link *);