1 /*-------------------------------------------------------------------------
2 SDCCsymt.c - Code 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 value *aggregateToPointer (value *val);
29 void printFromToType(sym_link *from, sym_link *to) {
30 fprintf (stderr, "from type '");
31 printTypeChain (from, stderr);
32 fprintf (stderr, "'\nto type '");
33 printTypeChain (to, stderr);
34 fprintf (stderr, "'\n");
38 char *nounName(sym_link *sl) {
39 switch (SPEC_NOUN(sl))
42 if (SPEC_LONG(sl)) return "long";
43 if (sl->select.s._short) return "short";
46 case V_FLOAT: return "float";
47 case V_CHAR: return "char";
48 case V_VOID: return "void";
49 case V_STRUCT: return "struct";
50 case V_LABEL: return "label";
51 case V_BIT: return "bit";
52 case V_SBIT: return "sbit";
53 case V_DOUBLE: return "double";
58 bucket *SymbolTab[256]; /* the symbol table */
59 bucket *StructTab[256]; /* the structure table */
60 bucket *TypedefTab[256]; /* the typedef table */
61 bucket *LabelTab[256]; /* the Label table */
62 bucket *enumTab[256]; /* enumerated table */
64 /*------------------------------------------------------------------*/
65 /* initSymt () - initialises symbol table related stuff */
66 /*------------------------------------------------------------------*/
72 for (i = 0; i < 256; i++)
73 SymbolTab[i] = StructTab[i] = (void *) NULL;
77 /*-----------------------------------------------------------------*/
78 /* newBucket - allocates & returns a new bucket */
79 /*-----------------------------------------------------------------*/
85 bp = Safe_alloc ( sizeof (bucket));
90 /*-----------------------------------------------------------------*/
91 /* hashKey - computes the hashkey given a symbol name */
92 /*-----------------------------------------------------------------*/
94 hashKey (const char *s)
96 unsigned long key = 0;
103 /*-----------------------------------------------------------------*/
104 /* addSym - adds a symbol to the hash Table */
105 /*-----------------------------------------------------------------*/
107 addSym (bucket ** stab,
114 int i; /* index into the hash Table */
115 bucket *bp; /* temp bucket * */
118 if (getenv("DEBUG_SANITY")) {
119 fprintf (stderr, "addSym: %s ", sname);
121 /* make sure the type is complete and sane */
122 checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
125 /* prevent overflow of the (r)name buffers */
126 if (strlen(sname)>SDCC_SYMNAME_MAX) {
127 werror (W_SYMBOL_NAME_TOO_LONG, SDCC_SYMNAME_MAX);
128 sname[SDCC_SYMNAME_MAX]='\0';
131 /* the symbols are always added at the head of the list */
133 /* get a free entry */
134 bp = Safe_alloc ( sizeof (bucket));
136 bp->sym = sym; /* update the symbol pointer */
137 bp->level = level; /* update the nest level */
139 strcpy (bp->name, sname); /* copy the name into place */
141 /* if this is the first entry */
144 bp->prev = bp->next = (void *) NULL; /* point to nothing */
147 /* not first entry then add @ head of list */
157 /*-----------------------------------------------------------------*/
158 /* deleteSym - deletes a symbol from the hash Table entry */
159 /*-----------------------------------------------------------------*/
161 deleteSym (bucket ** stab, void *sym, char *sname)
169 /* find the symbol */
172 if (bp->sym == sym) /* found it then break out */
173 break; /* of the loop */
177 if (!bp) /* did not find it */
179 /* if this is the first one in the chain */
183 if (stab[i]) /* if chain ! empty */
184 stab[i]->prev = (void *) NULL;
186 /* middle || end of chain */
189 if (bp->next) /* if not end of chain */
190 bp->next->prev = bp->prev;
192 bp->prev->next = bp->next;
197 /*-----------------------------------------------------------------*/
198 /* findSym - finds a symbol in a table */
199 /*-----------------------------------------------------------------*/
201 findSym (bucket ** stab, void *sym, const char *sname)
205 bp = stab[hashKey (sname)];
208 if (bp->sym == sym || strcmp (bp->name, sname) == 0)
213 return (bp ? bp->sym : (void *) NULL);
216 /*-----------------------------------------------------------------*/
217 /* findSymWithLevel - finds a symbol with a name & level */
218 /*-----------------------------------------------------------------*/
220 findSymWithLevel (bucket ** stab, symbol * sym)
224 bp = stab[hashKey (sym->name)];
227 ** do the search from the head of the list since the
228 ** elements are added at the head it is ensured that
229 ** we will find the deeper definitions before we find
230 ** the global ones. we need to check for symbols with
231 ** level <= to the level given, if levels match then block
232 ** numbers need to match as well
236 if (strcmp (bp->name, sym->name) == 0 && bp->level <= sym->level)
238 /* if this is parameter then nothing else need to be checked */
239 if (((symbol *) (bp->sym))->_isparm)
241 /* if levels match then block numbers should also match */
242 if (bp->level && bp->level == sym->level && bp->block == sym->block)
244 /* if levels don't match then we are okay */
245 if (bp->level && bp->level != sym->level && bp->block <= sym->block)
247 /* if this is a global variable then we are ok too */
255 return (void *) NULL;
258 /*-----------------------------------------------------------------*/
259 /* findSymWithBlock - finds a symbol with name in with a block */
260 /*-----------------------------------------------------------------*/
262 findSymWithBlock (bucket ** stab, symbol * sym, int block)
266 bp = stab[hashKey (sym->name)];
269 if (strcmp (bp->name, sym->name) == 0 &&
275 return (bp ? bp->sym : (void *) NULL);
278 /*------------------------------------------------------------------*/
279 /* newSymbol () - returns a new pointer to a symbol */
280 /*------------------------------------------------------------------*/
282 newSymbol (char *name, int scope)
286 sym = Safe_alloc ( sizeof (symbol));
288 strcpy (sym->name, name); /* copy the name */
289 sym->level = scope; /* set the level */
290 sym->block = currBlockno;
291 sym->lineDef = yylineno; /* set the line number */
295 /*------------------------------------------------------------------*/
296 /* newLink - creates a new link (declarator,specifier) */
297 /*------------------------------------------------------------------*/
303 p = Safe_alloc ( sizeof (sym_link));
308 /*------------------------------------------------------------------*/
309 /* newStruct - creats a new structdef from the free list */
310 /*------------------------------------------------------------------*/
312 newStruct (char *tag)
316 s = Safe_alloc ( sizeof (structdef));
318 strcpy (s->tag, tag); /* copy the tag */
322 /*------------------------------------------------------------------*/
323 /* pointerTypes - do the computation for the pointer types */
324 /*------------------------------------------------------------------*/
326 pointerTypes (sym_link * ptr, sym_link * type)
331 /* find the first pointer type */
332 while (ptr && !IS_PTR (ptr))
335 /* could not find it */
336 if (!ptr || IS_SPEC (ptr))
339 if (IS_PTR(ptr) && DCL_TYPE(ptr)!=UPOINTER) {
340 pointerTypes (ptr->next, type);
344 /* change the pointer type depending on the
345 storage class of the type */
348 DCL_PTR_CONST (ptr) = SPEC_CONST (type);
349 DCL_PTR_VOLATILE (ptr) = SPEC_VOLATILE (type);
350 switch (SPEC_SCLS (type))
353 DCL_TYPE (ptr) = FPOINTER;
356 DCL_TYPE (ptr) = IPOINTER;
359 DCL_TYPE (ptr) = PPOINTER;
362 DCL_TYPE (ptr) = POINTER;
365 DCL_PTR_CONST (ptr) = port->mem.code_ro;
366 DCL_TYPE (ptr) = CPOINTER;
369 DCL_TYPE (ptr) = EEPPOINTER;
372 DCL_TYPE (ptr) = GPOINTER;
375 /* the storage class of type ends here */
378 SPEC_VOLATILE (type) = 0;
381 /* now change all the remaining unknown pointers
382 to generic pointers */
385 if (!IS_SPEC (ptr) && DCL_TYPE (ptr) == UPOINTER)
386 DCL_TYPE (ptr) = GPOINTER;
390 /* same for the type although it is highly unlikely that
391 type will have a pointer */
394 if (!IS_SPEC (type) && DCL_TYPE (type) == UPOINTER)
395 DCL_TYPE (type) = GPOINTER;
401 /*------------------------------------------------------------------*/
402 /* addDecl - adds a declarator @ the end of a chain */
403 /*------------------------------------------------------------------*/
405 addDecl (symbol * sym, int type, sym_link * p)
411 /* if we are passed a link then set head & tail */
420 head = tail = newLink ();
421 DCL_TYPE (head) = type;
424 /* if this is the first entry */
432 if (IS_SPEC (sym->etype) && IS_SPEC (head) && head == tail)
434 sym->etype = mergeSpec (sym->etype, head, sym->name);
438 if (IS_SPEC (sym->etype) && !IS_SPEC (head) && head == tail)
441 while (t->next != sym->etype)
444 tail->next = sym->etype;
448 sym->etype->next = head;
454 /* if the type is an unknown pointer and has
455 a tspec then take the storage class const & volatile
456 attribute from the tspec & make it those of this
460 //DCL_TYPE (p) == UPOINTER &&
463 if (!IS_SPEC (sym->etype))
465 sym->etype = sym->etype->next = newLink ();
466 sym->etype->class = SPECIFIER;
468 SPEC_SCLS (sym->etype) = SPEC_SCLS (DCL_TSPEC (p));
469 SPEC_CONST (sym->etype) = SPEC_CONST (DCL_TSPEC (p));
470 SPEC_VOLATILE (sym->etype) = SPEC_VOLATILE (DCL_TSPEC (p));
471 DCL_TSPEC (p) = NULL;
476 /*------------------------------------------------------------------
477 checkTypeSanity: prevent the user from doing e.g.:
479 ------------------------------------------------------------------*/
480 void checkTypeSanity(sym_link *etype, char *name) {
484 if (getenv("DEBUG_SANITY")) {
485 fprintf (stderr, "sanity check skipped for %s (etype==0)\n", name);
490 if (!IS_SPEC(etype)) {
491 if (getenv("DEBUG_SANITY")) {
492 fprintf (stderr, "sanity check skipped for %s (!IS_SPEC)\n", name);
497 noun=nounName(etype);
499 if (getenv("DEBUG_SANITY")) {
500 fprintf (stderr, "checking sanity for %s %x\n", name, (int)etype);
503 if ((SPEC_NOUN(etype)==V_CHAR ||
504 SPEC_NOUN(etype)==V_FLOAT ||
505 SPEC_NOUN(etype)==V_DOUBLE ||
506 SPEC_NOUN(etype)==V_VOID) &&
507 (etype->select.s._short || SPEC_LONG(etype))) {
508 // long or short for char float double or void
509 werror (E_LONG_OR_SHORT_INVALID, noun, name);
511 if ((SPEC_NOUN(etype)==V_FLOAT ||
512 SPEC_NOUN(etype)==V_DOUBLE ||
513 SPEC_NOUN(etype)==V_VOID) &&
514 (etype->select.s._signed || SPEC_USIGN(etype))) {
515 // signed or unsigned for float double or void
516 werror (E_SIGNED_OR_UNSIGNED_INVALID, noun, name);
519 // special case for "short"
520 if (etype->select.s._short) {
521 SPEC_NOUN(etype) = options.shortis8bits ? V_CHAR : V_INT;
522 etype->select.s._short = 0;
526 "const a;" or "data b;" or "signed s" or "long l"
528 if (!SPEC_NOUN(etype)) {
529 SPEC_NOUN(etype)=V_INT;
532 if (etype->select.s._signed && SPEC_USIGN(etype)) {
533 // signed AND unsigned
534 werror (E_SIGNED_AND_UNSIGNED_INVALID, noun, name);
536 if (etype->select.s._short && SPEC_LONG(etype)) {
538 werror (E_LONG_AND_SHORT_INVALID, noun, name);
543 /*------------------------------------------------------------------*/
544 /* mergeSpec - merges two specifiers and returns the new one */
545 /*------------------------------------------------------------------*/
547 mergeSpec (sym_link * dest, sym_link * src, char *name)
549 sym_link *symlink=dest;
551 if (!IS_SPEC(dest) || !IS_SPEC(src)) {
552 werror (E_INTERNAL_ERROR, __FILE__, __LINE__, "cannot merge declarator");
556 if (SPEC_NOUN(src)) {
557 if (!SPEC_NOUN(dest)) {
558 SPEC_NOUN(dest)=SPEC_NOUN(src);
560 /* we shouldn't redeclare the type */
561 if (getenv("DEBUG_SANITY")) {
562 fprintf (stderr, "mergeSpec: ");
564 werror(E_TWO_OR_MORE_DATA_TYPES, name);
568 if (SPEC_SCLS(src)) {
569 /* if destination has no storage class */
570 if (!SPEC_SCLS (dest) || SPEC_SCLS(dest)==S_REGISTER) {
571 SPEC_SCLS (dest) = SPEC_SCLS (src);
573 if (getenv("DEBUG_SANITY")) {
574 fprintf (stderr, "mergeSpec: ");
576 werror(E_TWO_OR_MORE_STORAGE_CLASSES, name);
580 /* copy all the specifications */
582 // we really should do:
584 if (SPEC_what(src)) {
585 if (SPEC_what(dest)) {
586 werror(W_DUPLICATE_SPEC, "what");
588 SPEC_what(dst)|=SPEC_what(src);
591 // but there are more important thing right now
593 SPEC_LONG (dest) |= SPEC_LONG (src);
594 dest->select.s._short|=src->select.s._short;
595 SPEC_USIGN (dest) |= SPEC_USIGN (src);
596 dest->select.s._signed|=src->select.s._signed;
597 SPEC_STAT (dest) |= SPEC_STAT (src);
598 SPEC_EXTR (dest) |= SPEC_EXTR (src);
599 SPEC_CONST(dest) |= SPEC_CONST (src);
600 SPEC_ABSA (dest) |= SPEC_ABSA (src);
601 SPEC_VOLATILE (dest) |= SPEC_VOLATILE (src);
602 SPEC_ADDR (dest) |= SPEC_ADDR (src);
603 SPEC_OCLS (dest) = SPEC_OCLS (src);
604 SPEC_BLEN (dest) |= SPEC_BLEN (src);
605 SPEC_BSTR (dest) |= SPEC_BSTR (src);
606 SPEC_TYPEDEF (dest) |= SPEC_TYPEDEF (src);
608 if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL)
609 SPEC_STRUCT (dest) = SPEC_STRUCT (src);
611 /* these are the only function attributes that will be set
612 in a specifier while parsing */
613 FUNC_NONBANKED(dest) |= FUNC_NONBANKED(src);
614 FUNC_BANKED(dest) |= FUNC_BANKED(src);
615 FUNC_ISCRITICAL(dest) |= FUNC_ISCRITICAL(src);
616 FUNC_ISREENT(dest) |= FUNC_ISREENT(src);
617 FUNC_ISNAKED(dest) |= FUNC_ISNAKED(src);
618 FUNC_ISISR(dest) |= FUNC_ISISR(src);
619 FUNC_INTNO(dest) |= FUNC_INTNO(src);
620 FUNC_REGBANK(dest) |= FUNC_REGBANK(src);
625 /*------------------------------------------------------------------*/
626 /* cloneSpec - copies the entire spec and returns a new spec */
627 /*------------------------------------------------------------------*/
629 cloneSpec (sym_link * src)
633 /* go thru chain till we find the specifier */
634 while (src && src->class != SPECIFIER)
638 memcpy (spec, src, sizeof (sym_link));
642 /*------------------------------------------------------------------*/
643 /* genSymName - generates and returns a name used for anonymous vars */
644 /*------------------------------------------------------------------*/
646 genSymName (int level)
648 static int gCount = 0;
649 static char gname[SDCC_NAME_MAX + 1];
651 sprintf (gname, "__%04d%04d", level, gCount++);
655 /*------------------------------------------------------------------*/
656 /* getSpec - returns the specifier part from a declaration chain */
657 /*------------------------------------------------------------------*/
659 getSpec (sym_link * p)
664 while (p && !(IS_SPEC (p)))
670 /*------------------------------------------------------------------*/
671 /* newCharLink() - creates an char type */
672 /*------------------------------------------------------------------*/
679 p->class = SPECIFIER;
680 SPEC_NOUN (p) = V_CHAR;
685 /*------------------------------------------------------------------*/
686 /* newFloatLink - a new Float type */
687 /*------------------------------------------------------------------*/
694 p->class = SPECIFIER;
695 SPEC_NOUN (p) = V_FLOAT;
700 /*------------------------------------------------------------------*/
701 /* newLongLink() - new long type */
702 /*------------------------------------------------------------------*/
709 p->class = SPECIFIER;
710 SPEC_NOUN (p) = V_INT;
716 /*------------------------------------------------------------------*/
717 /* newIntLink() - creates an int type */
718 /*------------------------------------------------------------------*/
725 p->class = SPECIFIER;
726 SPEC_NOUN (p) = V_INT;
731 /*------------------------------------------------------------------*/
732 /* getSize - returns size of a type chain in bits */
733 /*------------------------------------------------------------------*/
735 getSize (sym_link * p)
737 /* if nothing return 0 */
741 { /* if this is the specifier then */
742 switch (SPEC_NOUN (p))
743 { /* depending on the specifier type */
745 return (IS_LONG (p) ? LONGSIZE : INTSIZE);
753 return SPEC_STRUCT (p)->size;
759 return ((SPEC_BLEN (p) / 8) + (SPEC_BLEN (p) % 8 ? 1 : 0));
765 /* this is a specifier */
766 switch (DCL_TYPE (p))
771 return DCL_ELEM (p) * getSize (p->next);
788 /*------------------------------------------------------------------*/
789 /* bitsForType - returns # of bits required to store this type */
790 /*------------------------------------------------------------------*/
792 bitsForType (sym_link * p)
794 /* if nothing return 0 */
799 { /* if this is the specifier then */
801 switch (SPEC_NOUN (p))
802 { /* depending on the specifier type */
804 return (IS_LONG (p) ? LONGSIZE * 8 : INTSIZE * 8);
806 return FLOATSIZE * 8;
812 return SPEC_STRUCT (p)->size * 8;
818 return SPEC_BLEN (p);
824 /* this is a specifier */
825 switch (DCL_TYPE (p))
830 return DCL_ELEM (p) * getSize (p->next) * 8;
834 return (PTRSIZE * 8);
838 return (FPTRSIZE * 8);
840 return (GPTRSIZE * 8);
847 /*------------------------------------------------------------------*/
848 /* copySymbolChain - copies a symbol chain */
849 /*------------------------------------------------------------------*/
851 copySymbolChain (symbol * src)
858 dest = copySymbol (src);
859 dest->next = copySymbolChain (src->next);
863 /*------------------------------------------------------------------*/
864 /* copySymbol - makes a copy of a symbol */
865 /*------------------------------------------------------------------*/
867 copySymbol (symbol * src)
874 dest = newSymbol (src->name, src->level);
875 memcpy (dest, src, sizeof (symbol));
876 dest->level = src->level;
877 dest->block = src->block;
878 dest->ival = copyIlist (src->ival);
879 dest->type = copyLinkChain (src->type);
880 dest->etype = getSpec (dest->type);
882 dest->key = src->key;
883 dest->allocreq = src->allocreq;
887 /*------------------------------------------------------------------*/
888 /* reverseSyms - reverses the links for a symbol chain */
889 /*------------------------------------------------------------------*/
891 reverseSyms (symbol * sym)
893 symbol *prev, *curr, *next;
908 sym->next = (void *) NULL;
912 /*------------------------------------------------------------------*/
913 /* reverseLink - reverses the links for a type chain */
914 /*------------------------------------------------------------------*/
916 reverseLink (sym_link * type)
918 sym_link *prev, *curr, *next;
933 type->next = (void *) NULL;
937 /*------------------------------------------------------------------*/
938 /* addSymChain - adds a symbol chain to the symboltable */
939 /*------------------------------------------------------------------*/
941 addSymChain (symbol * symHead)
943 symbol *sym = symHead;
946 for (; sym != NULL; sym = sym->next)
949 checkTypeSanity(sym->etype, sym->name);
951 /* if already exists in the symbol table then check if
952 one of them is an extern definition if yes then
953 then check if the type match, if the types match then
954 delete the current entry and add the new entry */
955 if ((csym = findSymWithLevel (SymbolTab, sym)) &&
956 csym->level == sym->level) {
958 /* one definition extern ? */
959 if (IS_EXTERN (csym->etype) || IS_EXTERN (sym->etype)) {
960 /* do types match ? */
961 if (compareType (csym->type, sym->type) != 1) {
963 werror (E_EXTERN_MISMATCH, csym->name);
966 /* delete current entry */
967 deleteSym (SymbolTab, csym, csym->name);
970 werror (E_DUPLICATE, sym->name);
976 addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1);
981 /*------------------------------------------------------------------*/
982 /* funcInChain - DCL Type 'FUNCTION' found in type chain */
983 /*------------------------------------------------------------------*/
985 funcInChain (sym_link * lnk)
996 /*------------------------------------------------------------------*/
997 /* structElemType - returns the type info of a sturct member */
998 /*------------------------------------------------------------------*/
1000 structElemType (sym_link * stype, value * id)
1002 symbol *fields = (SPEC_STRUCT (stype) ? SPEC_STRUCT (stype)->fields : NULL);
1003 sym_link *type, *etype;
1004 sym_link *petype = getSpec (stype);
1009 /* look for the id */
1012 if (strcmp (fields->rname, id->name) == 0)
1014 type = copyLinkChain (fields->type);
1015 etype = getSpec (type);
1016 SPEC_SCLS (etype) = (SPEC_SCLS (petype) == S_REGISTER ?
1017 SPEC_SCLS (etype) : SPEC_SCLS (petype));
1020 fields = fields->next;
1022 werror (E_NOT_MEMBER, id->name);
1027 /*------------------------------------------------------------------*/
1028 /* getStructElement - returns element of a tructure definition */
1029 /*------------------------------------------------------------------*/
1031 getStructElement (structdef * sdef, symbol * sym)
1035 for (field = sdef->fields; field; field = field->next)
1036 if (strcmp (field->name, sym->name) == 0)
1039 werror (E_NOT_MEMBER, sym->name);
1041 return sdef->fields;
1044 /*------------------------------------------------------------------*/
1045 /* compStructSize - computes the size of a structure */
1046 /*------------------------------------------------------------------*/
1048 compStructSize (int su, structdef * sdef)
1050 int sum = 0, usum = 0;
1054 /* for the identifiers */
1055 loop = sdef->fields;
1058 /* create the internal name for this variable */
1059 sprintf (loop->rname, "_%s", loop->name);
1060 loop->offset = (su == UNION ? sum = 0 : sum);
1061 SPEC_VOLATILE (loop->etype) |= (su == UNION ? 1 : 0);
1063 /* if this is a bit field */
1066 /* change it to a unsigned bit */
1067 SPEC_NOUN (loop->etype) = V_BIT;
1068 SPEC_USIGN (loop->etype) = 1;
1069 /* check if this fit into the remaining */
1070 /* bits of this byte else align it to the */
1071 /* next byte boundary */
1072 if ((SPEC_BLEN (loop->etype) = loop->bitVar) <= (8 - bitOffset)) {
1073 SPEC_BSTR (loop->etype) = bitOffset;
1074 if ((bitOffset += (loop->bitVar % 8)) == 8)
1077 else /* does not fit */ {
1079 SPEC_BSTR (loop->etype) = bitOffset;
1080 sum += (loop->bitVar / 8);
1081 bitOffset += (loop->bitVar % 8);
1083 /* if this is the last field then pad */
1084 if (!loop->next && bitOffset && bitOffset != 8) {
1090 checkDecl (loop, 1);
1091 sum += getSize (loop->type);
1094 /* if function then do the arguments for it */
1095 if (funcInChain (loop->type)) {
1096 processFuncArgs (loop, 1);
1101 /* if this is not a bitfield but the */
1102 /* previous one was and did not take */
1103 /* the whole byte then pad the rest */
1104 if ((loop && !loop->bitVar) && bitOffset) {
1109 /* if union then size = sizeof larget field */
1111 usum = max (usum, sum);
1115 return (su == UNION ? usum : sum);
1118 /*------------------------------------------------------------------*/
1119 /* checkSClass - check the storage class specification */
1120 /*------------------------------------------------------------------*/
1122 checkSClass (symbol * sym, int isProto)
1124 if (getenv("DEBUG_SANITY")) {
1125 fprintf (stderr, "checkSClass: %s \n", sym->name);
1128 /* type is literal can happen foe enums change
1130 if (SPEC_SCLS (sym->etype) == S_LITERAL && !SPEC_ENUM (sym->etype))
1131 SPEC_SCLS (sym->etype) = S_AUTO;
1133 /* if sfr or sbit then must also be */
1134 /* volatile the initial value will be xlated */
1135 /* to an absolute address */
1136 if (SPEC_SCLS (sym->etype) == S_SBIT ||
1137 SPEC_SCLS (sym->etype) == S_SFR)
1139 SPEC_VOLATILE (sym->etype) = 1;
1140 /* if initial value given */
1143 SPEC_ABSA (sym->etype) = 1;
1144 SPEC_ADDR (sym->etype) =
1145 (int) list2int (sym->ival);
1150 /* if absolute address given then it mark it as
1152 if (IS_ABSOLUTE (sym->etype))
1153 SPEC_VOLATILE (sym->etype) = 1;
1155 /* global variables declared const put into code */
1156 if (sym->level == 0 &&
1157 SPEC_CONST (sym->etype)) {
1158 SPEC_SCLS (sym->etype) = S_CODE;
1161 /* global variable in code space is a constant */
1162 if (sym->level == 0 &&
1163 SPEC_SCLS (sym->etype) == S_CODE &&
1165 SPEC_CONST (sym->etype) = 1;
1168 /* if bit variable then no storage class can be */
1169 /* specified since bit is already a storage */
1170 if (IS_BITVAR (sym->etype) &&
1171 (SPEC_SCLS (sym->etype) != S_FIXED &&
1172 SPEC_SCLS (sym->etype) != S_SBIT &&
1173 SPEC_SCLS (sym->etype) != S_BIT)
1176 werror (E_BITVAR_STORAGE, sym->name);
1177 SPEC_SCLS (sym->etype) = S_FIXED;
1180 /* extern variables cannot be initialized */
1181 if (IS_EXTERN (sym->etype) && sym->ival)
1183 werror (E_EXTERN_INIT, sym->name);
1187 /* if this is an atomatic symbol */
1188 if (sym->level && (options.stackAuto || reentrant)) {
1189 if ((SPEC_SCLS (sym->etype) == S_AUTO ||
1190 SPEC_SCLS (sym->etype) == S_FIXED ||
1191 SPEC_SCLS (sym->etype) == S_REGISTER ||
1192 SPEC_SCLS (sym->etype) == S_STACK ||
1193 SPEC_SCLS (sym->etype) == S_XSTACK)) {
1194 SPEC_SCLS (sym->etype) = S_AUTO;
1196 /* storage class may only be specified for statics */
1197 if (!IS_STATIC(sym->etype)) {
1198 werror (E_AUTO_ASSUMED, sym->name);
1203 /* automatic symbols cannot be given */
1204 /* an absolute address ignore it */
1206 SPEC_ABSA (sym->etype) &&
1207 (options.stackAuto || reentrant))
1209 werror (E_AUTO_ABSA, sym->name);
1210 SPEC_ABSA (sym->etype) = 0;
1213 /* arrays & pointers cannot be defined for bits */
1214 /* SBITS or SFRs or BIT */
1215 if ((IS_ARRAY (sym->type) || IS_PTR (sym->type)) &&
1216 (SPEC_NOUN (sym->etype) == V_BIT ||
1217 SPEC_NOUN (sym->etype) == V_SBIT ||
1218 SPEC_SCLS (sym->etype) == S_SFR))
1219 werror (E_BIT_ARRAY, sym->name);
1221 /* if this is a bit|sbit then set length & start */
1222 if (SPEC_NOUN (sym->etype) == V_BIT ||
1223 SPEC_NOUN (sym->etype) == V_SBIT)
1225 SPEC_BLEN (sym->etype) = 1;
1226 SPEC_BSTR (sym->etype) = 0;
1230 /* variables declared in CODE space must have */
1231 /* initializers if not an extern */
1232 if (SPEC_SCLS (sym->etype) == S_CODE &&
1233 sym->ival == NULL &&
1235 port->mem.code_ro &&
1236 !IS_EXTERN (sym->etype) &&
1237 !funcInChain (sym->type))
1238 werror (E_CODE_NO_INIT, sym->name);
1241 /* if parameter or local variable then change */
1242 /* the storage class to reflect where the var will go */
1243 if (sym->level && SPEC_SCLS (sym->etype) == S_FIXED &&
1244 !IS_STATIC(sym->etype))
1246 if (options.stackAuto || (currFunc && IFFUNC_ISREENT (currFunc->type)))
1248 SPEC_SCLS (sym->etype) = (options.useXstack ?
1249 S_XSTACK : S_STACK);
1253 /* hack-o-matic! I see no reason why the useXstack option should ever
1254 * control this allcoation, but the code was originally that way, and
1255 * changing it for non-390 ports breaks the compiler badly.
1257 bool useXdata = TARGET_IS_DS390 ? 1 : options.useXstack;
1258 SPEC_SCLS (sym->etype) = (useXdata ?
1264 /*------------------------------------------------------------------*/
1265 /* changePointer - change pointer to functions */
1266 /*------------------------------------------------------------------*/
1268 changePointer (symbol * sym)
1272 /* go thru the chain of declarations */
1273 /* if we find a pointer to a function */
1274 /* unconditionally change it to a ptr */
1276 for (p = sym->type; p; p = p->next)
1278 if (!IS_SPEC (p) && DCL_TYPE (p) == UPOINTER)
1279 DCL_TYPE (p) = GPOINTER;
1280 if (IS_PTR (p) && IS_FUNC (p->next))
1281 DCL_TYPE (p) = CPOINTER;
1285 /*------------------------------------------------------------------*/
1286 /* checkDecl - does semantic validation of a declaration */
1287 /*------------------------------------------------------------------*/
1289 checkDecl (symbol * sym, int isProto)
1292 checkSClass (sym, isProto); /* check the storage class */
1293 changePointer (sym); /* change pointers if required */
1295 /* if this is an array without any dimension
1296 then update the dimension from the initial value */
1297 if (IS_ARRAY (sym->type) && !DCL_ELEM (sym->type))
1298 DCL_ELEM (sym->type) = getNelements (sym->type, sym->ival);
1303 /*------------------------------------------------------------------*/
1304 /* copyLinkChain - makes a copy of the link chain & rets ptr 2 head */
1305 /*------------------------------------------------------------------*/
1307 copyLinkChain (sym_link * p)
1309 sym_link *head, *curr, *loop;
1312 head = loop = (curr ? newLink () : (void *) NULL);
1315 memcpy (loop, curr, sizeof (sym_link)); /* copy it */
1316 loop->next = (curr->next ? newLink () : (void *) NULL);
1325 /*------------------------------------------------------------------*/
1326 /* cleanUpBlock - cleansup the symbol table specified for all the */
1327 /* symbols in the given block */
1328 /*------------------------------------------------------------------*/
1330 cleanUpBlock (bucket ** table, int block)
1335 /* go thru the entire table */
1336 for (i = 0; i < 256; i++)
1338 for (chain = table[i]; chain; chain = chain->next)
1340 if (chain->block >= block)
1342 deleteSym (table, chain->sym, chain->name);
1348 /*------------------------------------------------------------------*/
1349 /* cleanUpLevel - cleansup the symbol table specified for all the */
1350 /* symbols in the given level */
1351 /*------------------------------------------------------------------*/
1353 cleanUpLevel (bucket ** table, int level)
1358 /* go thru the entire table */
1359 for (i = 0; i < 256; i++)
1361 for (chain = table[i]; chain; chain = chain->next)
1363 if (chain->level >= level)
1365 deleteSym (table, chain->sym, chain->name);
1371 /*------------------------------------------------------------------*/
1372 /* computeType - computes the resultant type from two types */
1373 /*------------------------------------------------------------------*/
1375 computeType (sym_link * type1, sym_link * type2)
1379 sym_link *etype1 = getSpec (type1);
1380 sym_link *etype2 = getSpec (type2);
1382 /* if one of them is a float then result is a float */
1383 /* here we assume that the types passed are okay */
1384 /* and can be cast to one another */
1385 /* which ever is greater in size */
1386 if (IS_FLOAT (etype1) || IS_FLOAT (etype2))
1387 rType = newFloatLink ();
1389 /* if only one of them is a bit variable
1390 then the other one prevails */
1391 if (IS_BITVAR (etype1) && !IS_BITVAR (etype2))
1392 rType = copyLinkChain (type2);
1393 else if (IS_BITVAR (etype2) && !IS_BITVAR (etype1))
1394 rType = copyLinkChain (type1);
1396 /* if one of them is a pointer then that
1399 rType = copyLinkChain (type1);
1400 else if (IS_PTR (type2))
1401 rType = copyLinkChain (type2);
1402 else if (getSize (type1) > getSize (type2))
1403 rType = copyLinkChain (type1);
1405 rType = copyLinkChain (type2);
1407 reType = getSpec (rType);
1409 /* if either of them unsigned but not val then make this unsigned */
1410 if (((!IS_LITERAL(type1) && SPEC_USIGN (etype1)) ||
1411 (!IS_LITERAL(type2) && SPEC_USIGN (etype2))) &&
1413 SPEC_USIGN (reType) = 1;
1415 SPEC_USIGN (reType) = 0;
1417 /* if result is a literal then make not so */
1418 if (IS_LITERAL (reType))
1419 SPEC_SCLS (reType) = S_REGISTER;
1424 /*--------------------------------------------------------------------*/
1425 /* compareType - will do type check return 1 if match, -1 if castable */
1426 /*--------------------------------------------------------------------*/
1428 compareType (sym_link * dest, sym_link * src)
1439 /* if dest is a declarator then */
1444 if (DCL_TYPE (src) == DCL_TYPE (dest)) {
1446 //checkFunction(src,dest);
1448 return compareType (dest->next, src->next);
1450 if (IS_PTR (src) && IS_GENPTR (dest))
1452 if (IS_PTR (dest) && IS_ARRAY (src)) {
1453 value *val=aggregateToPointer (valFromType(src));
1454 int res=compareType (dest, val->type);
1455 Safe_free(val->type);
1457 //return res ? -1 : 0;
1460 if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
1461 return compareType (dest->next, src);
1464 else if (IS_PTR (dest) && IS_INTEGRAL (src))
1470 /* if one is a specifier and the other is not */
1471 if ((IS_SPEC (src) && !IS_SPEC (dest)) ||
1472 (IS_SPEC (dest) && !IS_SPEC (src)))
1475 /* if one of them is a void then ok */
1476 if (SPEC_NOUN (dest) == V_VOID &&
1477 SPEC_NOUN (src) != V_VOID)
1480 if (SPEC_NOUN (dest) != V_VOID &&
1481 SPEC_NOUN (src) == V_VOID)
1484 /* if they are both bitfields then if the lengths
1485 and starts don't match */
1486 if (IS_BITFIELD (dest) && IS_BITFIELD (src) &&
1487 (SPEC_BLEN (dest) != SPEC_BLEN (src) ||
1488 SPEC_BSTR (dest) != SPEC_BSTR (src)))
1491 /* it is a specifier */
1492 if (SPEC_NOUN (dest) != SPEC_NOUN (src))
1494 if (SPEC_USIGN (dest) == SPEC_USIGN (src) &&
1495 IS_INTEGRAL (dest) && IS_INTEGRAL (src) &&
1496 getSize (dest) == getSize (src))
1498 else if (IS_ARITHMETIC (dest) && IS_ARITHMETIC (src))
1503 else if (IS_STRUCT (dest))
1505 if (SPEC_STRUCT (dest) != SPEC_STRUCT (src))
1510 if (SPEC_LONG (dest) != SPEC_LONG (src))
1513 if (SPEC_USIGN (dest) != SPEC_USIGN (src))
1519 /*------------------------------------------------------------------*/
1520 /* inCalleeSaveList - return 1 if found in callee save list */
1521 /*------------------------------------------------------------------*/
1523 inCalleeSaveList (char *s)
1527 for (i = 0; options.calleeSaves[i]; i++)
1528 if (strcmp (options.calleeSaves[i], s) == 0)
1534 /*-----------------------------------------------------------------*/
1535 /* aggregateToPointer: change an agggregate type function */
1536 /* argument to a pointer to that type. */
1537 /*-----------------------------------------------------------------*/
1539 aggregateToPointer (value * val)
1541 if (IS_AGGREGATE (val->type))
1543 /* if this is a structure */
1544 /* then we need to add a new link */
1545 if (IS_STRUCT (val->type))
1547 /* first lets add DECLARATOR type */
1548 sym_link *p = val->type;
1550 werror (W_STRUCT_AS_ARG, val->name);
1551 val->type = newLink ();
1552 val->type->next = p;
1555 /* change to a pointer depending on the */
1556 /* storage class specified */
1557 switch (SPEC_SCLS (val->etype))
1560 DCL_TYPE (val->type) = IPOINTER;
1563 DCL_TYPE (val->type) = PPOINTER;
1566 if (SPEC_OCLS(val->etype)) {
1567 DCL_TYPE(val->type)=PTR_TYPE(SPEC_OCLS(val->etype));
1571 if (TARGET_IS_DS390)
1573 /* The AUTO and REGISTER classes should probably
1574 * also become generic pointers, but I haven't yet
1575 * devised a test case for that.
1577 DCL_TYPE (val->type) = GPOINTER;
1580 if (options.model==MODEL_LARGE) {
1581 DCL_TYPE (val->type) = FPOINTER;
1588 DCL_TYPE (val->type) = POINTER;
1591 DCL_TYPE (val->type) = CPOINTER;
1594 DCL_TYPE (val->type) = FPOINTER;
1597 DCL_TYPE (val->type) = EEPPOINTER;
1600 DCL_TYPE (val->type) = GPOINTER;
1603 /* is there is a symbol associated then */
1604 /* change the type of the symbol as well */
1607 val->sym->type = copyLinkChain (val->type);
1608 val->sym->etype = getSpec (val->sym->type);
1613 /*------------------------------------------------------------------*/
1614 /* checkFunction - does all kinds of check on a function */
1615 /*------------------------------------------------------------------*/
1617 checkFunction (symbol * sym, symbol *csym)
1619 value *exargs, *acargs;
1623 if (getenv("DEBUG_SANITY")) {
1624 fprintf (stderr, "checkFunction: %s ", sym->name);
1627 /* make sure the type is complete and sane */
1628 checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
1630 /* if not type then some kind of error */
1634 /* if the function has no type then make it return int */
1635 if (!sym->type->next)
1636 sym->type->next = sym->etype = newIntLink ();
1638 /* function cannot return aggregate */
1639 if (IS_AGGREGATE (sym->type->next))
1641 werror (E_FUNC_AGGR, sym->name);
1645 /* function cannot return bit */
1646 if (IS_BITVAR (sym->type->next))
1648 werror (E_FUNC_BIT, sym->name);
1652 /* check if this function is defined as calleeSaves
1653 then mark it as such */
1654 FUNC_CALLEESAVES(sym->type) = inCalleeSaveList (sym->name);
1656 /* if interrupt service routine */
1657 /* then it cannot have arguments */
1658 if (IFFUNC_ARGS(sym->type) && FUNC_ISISR (sym->type))
1660 if (!IS_VOID(FUNC_ARGS(sym->type)->type)) {
1661 werror (E_INT_ARGS, sym->name);
1662 FUNC_ARGS(sym->type)=NULL;
1666 if (!csym && !(csym = findSym (SymbolTab, sym, sym->name)))
1667 return 1; /* not defined nothing more to check */
1669 /* check if body already present */
1670 if (csym && IFFUNC_HASBODY(csym->type))
1672 werror (E_FUNC_BODY, sym->name);
1676 /* check the return value type */
1677 if (compareType (csym->type, sym->type) <= 0)
1679 werror (E_PREV_DEF_CONFLICT, csym->name, "type");
1680 printFromToType(csym->type, sym->type);
1684 if (FUNC_ISISR (csym->type) != FUNC_ISISR (sym->type))
1686 werror (E_PREV_DEF_CONFLICT, csym->name, "interrupt");
1689 if (FUNC_REGBANK (csym->type) != FUNC_REGBANK (sym->type))
1691 werror (E_PREV_DEF_CONFLICT, csym->name, "using");
1694 if (IFFUNC_ISNAKED (csym->type) != IFFUNC_ISNAKED (sym->type))
1696 werror (E_PREV_DEF_CONFLICT, csym->name, "_naked");
1699 /* compare expected args with actual args */
1700 exargs = FUNC_ARGS(csym->type);
1701 acargs = FUNC_ARGS(sym->type);
1703 /* for all the expected args do */
1706 exargs = exargs->next, acargs = acargs->next, argCnt++)
1708 if (getenv("DEBUG_SANITY")) {
1709 fprintf (stderr, "checkFunction: %s ", exargs->name);
1711 /* make sure the type is complete and sane */
1712 checkTypeSanity(exargs->etype, exargs->name);
1714 /* If the actual argument is an array, any prototype
1715 * will have modified it to a pointer. Duplicate that
1718 if (IS_AGGREGATE (acargs->type))
1720 checkValue = copyValue (acargs);
1721 aggregateToPointer (checkValue);
1725 checkValue = acargs;
1728 if (compareType (exargs->type, checkValue->type) <= 0)
1730 werror (E_ARG_TYPE, argCnt);
1731 printFromToType(exargs->type, checkValue->type);
1736 /* if one them ended we have a problem */
1737 if ((exargs && !acargs && !IS_VOID (exargs->type)) ||
1738 (!exargs && acargs && !IS_VOID (acargs->type)))
1739 werror (E_ARG_COUNT);
1741 /* replace with this defition */
1742 sym->cdef = csym->cdef;
1743 deleteSym (SymbolTab, csym, csym->name);
1744 addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1);
1745 if (IS_EXTERN (csym->etype) && !
1746 IS_EXTERN (sym->etype))
1748 addSet (&publics, sym);
1753 /*-----------------------------------------------------------------*/
1754 /* processFuncArgs - does some processing with function args */
1755 /*-----------------------------------------------------------------*/
1757 processFuncArgs (symbol * func, int ignoreName)
1762 /* if this function has variable argument list */
1763 /* then make the function a reentrant one */
1764 if (IFFUNC_HASVARARGS(func->type))
1765 FUNC_ISREENT(func->type)=1;
1767 /* check if this function is defined as calleeSaves
1768 then mark it as such */
1769 FUNC_CALLEESAVES(func->type) = inCalleeSaveList (func->name);
1771 /* loop thru all the arguments */
1772 val = FUNC_ARGS(func->type);
1774 /* if it is void then remove parameters */
1775 if (val && IS_VOID (val->type))
1777 FUNC_ARGS(func->type) = NULL;
1781 /* reset regparm for the port */
1782 (*port->reset_regparms) ();
1783 /* if any of the arguments is an aggregate */
1784 /* change it to pointer to the same type */
1787 /* mark it as a register parameter if
1788 the function does not have VA_ARG
1789 and as port dictates */
1790 if (!IFFUNC_HASVARARGS(func->type) &&
1791 (*port->reg_parm) (val->type))
1793 SPEC_REGPARM (val->etype) = 1;
1796 if (IS_AGGREGATE (val->type))
1798 aggregateToPointer (val);
1804 /* if this is an internal generated function call */
1806 /* ignore --stack-auto for this one, we don't know how it is compiled */
1807 /* simply trust on --int-long-reent or --float-reent */
1808 if (IFFUNC_ISREENT(func->type)) {
1812 /* if this function is reentrant or */
1813 /* automatics r 2b stacked then nothing */
1814 if (IFFUNC_ISREENT (func->type) || options.stackAuto)
1818 val = FUNC_ARGS(func->type);
1823 /* if a symbolname is not given */
1824 /* synthesize a variable name */
1828 sprintf (val->name, "_%s_PARM_%d", func->name, pNum++);
1829 val->sym = newSymbol (val->name, 1);
1830 SPEC_OCLS (val->etype) = port->mem.default_local_map;
1831 val->sym->type = copyLinkChain (val->type);
1832 val->sym->etype = getSpec (val->sym->type);
1833 val->sym->_isparm = 1;
1834 strcpy (val->sym->rname, val->name);
1835 SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
1836 SPEC_STAT (func->etype);
1837 addSymChain (val->sym);
1840 else /* symbol name given create synth name */
1843 sprintf (val->name, "_%s_PARM_%d", func->name, pNum++);
1844 strcpy (val->sym->rname, val->name);
1845 val->sym->_isparm = 1;
1846 SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) =
1847 (options.model != MODEL_SMALL ? xdata : data);
1848 SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
1849 SPEC_STAT (func->etype);
1855 /*-----------------------------------------------------------------*/
1856 /* isSymbolEqual - compares two symbols return 1 if they match */
1857 /*-----------------------------------------------------------------*/
1859 isSymbolEqual (symbol * dest, symbol * src)
1861 /* if pointers match then equal */
1865 /* if one of them is null then don't match */
1869 /* if both of them have rname match on rname */
1870 if (dest->rname[0] && src->rname[0])
1871 return (!strcmp (dest->rname, src->rname));
1873 /* otherwise match on name */
1874 return (!strcmp (dest->name, src->name));
1877 void PT(sym_link *type)
1879 printTypeChain(type,0);
1881 /*-----------------------------------------------------------------*/
1882 /* printTypeChain - prints the type chain in human readable form */
1883 /*-----------------------------------------------------------------*/
1885 printTypeChain (sym_link * start, FILE * of)
1888 sym_link * type, * search;
1897 fprintf (of, "**err**");
1901 /* print the chain as it is written in the source: */
1902 /* start with the last entry */
1903 for (type = start; type && type->next; type = type->next)
1909 if (DCL_PTR_VOLATILE (type)) {
1910 fprintf (of, "volatile ");
1912 switch (DCL_TYPE (type))
1915 fprintf (of, "function ");
1918 if (DCL_PTR_CONST (type))
1919 fprintf (of, "const ");
1920 fprintf (of, "* generic ");
1923 if (DCL_PTR_CONST (type))
1924 fprintf (of, "const ");
1925 fprintf (of, "* code ");
1928 if (DCL_PTR_CONST (type))
1929 fprintf (of, "const ");
1930 fprintf (of, "* xdata ");
1933 if (DCL_PTR_CONST (type))
1934 fprintf (of, "const ");
1935 fprintf (of, "* eeprom ");
1939 if (DCL_PTR_CONST (type))
1940 fprintf (of, "const ");
1941 fprintf (of, "* near ");
1944 if (DCL_PTR_CONST (type))
1945 fprintf (of, "const ");
1946 fprintf (of, "* idata ");
1949 if (DCL_PTR_CONST (type))
1950 fprintf (of, "const ");
1951 fprintf (of, "* pdata ");
1954 if (DCL_PTR_CONST (type))
1955 fprintf (of, "const ");
1956 fprintf (of, "* unkown ");
1959 fprintf (of, "[] ");
1965 switch (SPEC_SCLS(type))
1967 case S_DATA: fprintf (of, "data "); break;
1968 case S_XDATA: fprintf (of, "xdata "); break;
1969 case S_SFR: fprintf (of, "sfr "); break;
1970 case S_SBIT: fprintf (of, "sbit "); break;
1971 case S_CODE: fprintf (of, "code "); break;
1972 case S_IDATA: fprintf (of, "idata "); break;
1973 case S_PDATA: fprintf (of, "pdata "); break;
1974 case S_LITERAL: fprintf (of, "literal "); break;
1975 case S_STACK: fprintf (of, "stack "); break;
1976 case S_XSTACK: fprintf (of, "xstack "); break;
1977 case S_BIT: fprintf (of, "bit "); break;
1978 case S_EEPROM: fprintf (of, "eeprom "); break;
1982 if (SPEC_VOLATILE (type))
1983 fprintf (of, "volatile ");
1984 if (SPEC_USIGN (type))
1985 fprintf (of, "unsigned ");
1986 if (SPEC_CONST (type))
1987 fprintf (of, "const ");
1989 switch (SPEC_NOUN (type))
1993 fprintf (of, "long ");
1994 fprintf (of, "int");
1998 fprintf (of, "char");
2002 fprintf (of, "void");
2006 fprintf (of, "float");
2010 fprintf (of, "struct %s", SPEC_STRUCT (type)->tag);
2014 fprintf (of, "sbit");
2018 fprintf (of, "bit {%d,%d}", SPEC_BSTR (type), SPEC_BLEN (type));
2022 fprintf (of, "double");
2026 fprintf (of, "unknown type");
2030 /* search entry in list before "type" */
2031 for (search = start; search && search->next != type;)
2032 search = search->next;
2041 /*-----------------------------------------------------------------*/
2042 /* cdbTypeInfo - print the type information for debugger */
2043 /*-----------------------------------------------------------------*/
2045 cdbTypeInfo (sym_link * type, FILE * of)
2047 fprintf (of, "{%d}", getSize (type));
2052 switch (DCL_TYPE (type))
2055 fprintf (of, "DF,");
2058 fprintf (of, "DG,");
2061 fprintf (of, "DC,");
2064 fprintf (of, "DX,");
2067 fprintf (of, "DD,");
2070 fprintf (of, "DI,");
2073 fprintf (of, "DP,");
2076 fprintf (of, "DA,");
2079 fprintf (of, "DA%d,", DCL_ELEM (type));
2087 switch (SPEC_NOUN (type))
2109 fprintf (of, "ST%s", SPEC_STRUCT (type)->tag);
2117 fprintf (of, "SB%d$%d", SPEC_BSTR (type), SPEC_BLEN (type));
2124 if (SPEC_USIGN (type))
2132 /*-----------------------------------------------------------------*/
2133 /* cdbSymbol - prints a symbol & its type information for debugger */
2134 /*-----------------------------------------------------------------*/
2136 cdbSymbol (symbol * sym, FILE * of, int isStructSym, int isFunc)
2148 fprintf (of, "S:"); /* symbol record */
2149 /* if this is not a structure symbol then
2150 we need to figure out the scope information */
2156 if (IS_STATIC (sym->etype))
2157 fprintf (of, "F%s$", moduleName); /* scope is file */
2159 fprintf (of, "G$"); /* scope is global */
2162 /* symbol is local */
2163 fprintf (of, "L%s$", (sym->localof ? sym->localof->name : "-null-"));
2166 fprintf (of, "S$"); /* scope is structure */
2168 /* print the name, & mangled name */
2169 fprintf (of, "%s$%d$%d(", sym->name,
2170 sym->level, sym->block);
2172 cdbTypeInfo (sym->type, of);
2175 /* print the address space */
2176 map = SPEC_OCLS (sym->etype);
2177 fprintf (of, "%c,%d,%d",
2178 (map ? map->dbName : 'Z'), sym->onStack, SPEC_STAK (sym->etype));
2180 /* if assigned to registers then output register names */
2181 /* if this is a function then print
2182 if is it an interrupt routine & interrupt number
2183 and the register bank it is using */
2185 fprintf (of, ",%d,%d,%d", FUNC_ISISR (sym->type),
2186 FUNC_INTNO (sym->type), FUNC_REGBANK (sym->type));
2187 /* alternate location to find this symbol @ : eg registers
2194 /*-----------------------------------------------------------------*/
2195 /* cdbStruct - print a structure for debugger */
2196 /*-----------------------------------------------------------------*/
2198 cdbStruct (structdef * sdef, int block, FILE * of,
2199 int inStruct, char *tag)
2204 /* if block # then must have function scope */
2205 fprintf (of, "F%s$", moduleName);
2206 fprintf (of, "%s[", (tag ? tag : sdef->tag));
2207 for (sym = sdef->fields; sym; sym = sym->next)
2209 fprintf (of, "({%d}", sym->offset);
2210 cdbSymbol (sym, of, TRUE, FALSE);
2218 /*------------------------------------------------------------------*/
2219 /* cdbStructBlock - calls struct printing for a blcks */
2220 /*------------------------------------------------------------------*/
2222 cdbStructBlock (int block, FILE * of)
2225 bucket **table = StructTab;
2229 /* go thru the entire table */
2230 for (i = 0; i < 256; i++)
2232 for (chain = table[i]; chain; chain = chain->next)
2234 if (chain->block >= block)
2236 cdbStruct ((structdef *) chain->sym, chain->block, of, 0, NULL);
2242 /*-----------------------------------------------------------------*/
2243 /* powof2 - returns power of two for the number if number is pow 2 */
2244 /*-----------------------------------------------------------------*/
2246 powof2 (unsigned long num)
2259 if (n1s > 1 || nshifts == 0)
2275 /* Dims: mul/div/mod, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
2276 symbol *__muldiv[3][3][2];
2277 /* Dims: BYTE/WORD/DWORD SIGNED/UNSIGNED */
2278 sym_link *__multypes[3][2];
2279 /* Dims: to/from float, BYTE/WORD/DWORD, SIGNED/USIGNED */
2280 symbol *__conv[2][3][2];
2281 /* Dims: shift left/shift right, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
2282 symbol *__rlrr[2][3][2];
2284 sym_link *floatType;
2287 _mangleFunctionName(char *in)
2289 if (port->getMangledFunctionName)
2291 return port->getMangledFunctionName(in);
2299 /*-----------------------------------------------------------------*/
2300 /* initCSupport - create functions for C support routines */
2301 /*-----------------------------------------------------------------*/
2305 const char *smuldivmod[] =
2309 const char *sbwd[] =
2311 "char", "int", "long"
2317 const char *srlrr[] =
2322 int bwd, su, muldivmod, tofrom, rlrr;
2324 if (getenv("SDCC_NO_C_SUPPORT")) {
2325 /* for debugging only */
2329 floatType = newFloatLink ();
2331 for (bwd = 0; bwd < 3; bwd++)
2348 __multypes[bwd][0] = l;
2349 __multypes[bwd][1] = copyLinkChain (l);
2350 SPEC_USIGN (__multypes[bwd][1]) = 1;
2353 __fsadd = funcOfType ("__fsadd", floatType, floatType, 2, options.float_rent);
2354 __fssub = funcOfType ("__fssub", floatType, floatType, 2, options.float_rent);
2355 __fsmul = funcOfType ("__fsmul", floatType, floatType, 2, options.float_rent);
2356 __fsdiv = funcOfType ("__fsdiv", floatType, floatType, 2, options.float_rent);
2357 __fseq = funcOfType ("__fseq", CHARTYPE, floatType, 2, options.float_rent);
2358 __fsneq = funcOfType ("__fsneq", CHARTYPE, floatType, 2, options.float_rent);
2359 __fslt = funcOfType ("__fslt", CHARTYPE, floatType, 2, options.float_rent);
2360 __fslteq = funcOfType ("__fslteq", CHARTYPE, floatType, 2, options.float_rent);
2361 __fsgt = funcOfType ("__fsgt", CHARTYPE, floatType, 2, options.float_rent);
2362 __fsgteq = funcOfType ("__fsgteq", CHARTYPE, floatType, 2, options.float_rent);
2364 for (tofrom = 0; tofrom < 2; tofrom++)
2366 for (bwd = 0; bwd < 3; bwd++)
2368 for (su = 0; su < 2; su++)
2372 sprintf (buffer, "__fs2%s%s", ssu[su], sbwd[bwd]);
2373 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], floatType, 1, options.float_rent);
2377 sprintf (buffer, "__%s%s2fs", ssu[su], sbwd[bwd]);
2378 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), floatType, __multypes[bwd][su], 1, options.float_rent);
2384 for (muldivmod = 0; muldivmod < 3; muldivmod++)
2386 for (bwd = 0; bwd < 3; bwd++)
2388 for (su = 0; su < 2; su++)
2390 sprintf (buffer, "_%s%s%s",
2391 smuldivmod[muldivmod],
2394 __muldiv[muldivmod][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent);
2395 FUNC_NONBANKED (__muldiv[muldivmod][bwd][su]->type) = 1;
2400 for (rlrr = 0; rlrr < 2; rlrr++)
2402 for (bwd = 0; bwd < 3; bwd++)
2404 for (su = 0; su < 2; su++)
2406 sprintf (buffer, "_%s%s%s",
2410 __rlrr[rlrr][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[0][0], 2, options.intlong_rent);
2411 FUNC_NONBANKED (__rlrr[rlrr][bwd][su]->type) = 1;