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 -------------------------------------------------------------------------*/
28 char *nounName(sym_link *sl) {
29 switch (SPEC_NOUN(sl))
32 if (SPEC_LONG(sl)) return "long";
33 if (sl->select.s._short) return "short";
36 case V_FLOAT: return "float";
37 case V_CHAR: return "char";
38 case V_VOID: return "void";
39 case V_STRUCT: return "struct";
40 case V_LABEL: return "label";
41 case V_BIT: return "bit";
42 case V_SBIT: return "sbit";
43 case V_DOUBLE: return "double";
48 bucket *SymbolTab[256]; /* the symbol table */
49 bucket *StructTab[256]; /* the structure table */
50 bucket *TypedefTab[256]; /* the typedef table */
51 bucket *LabelTab[256]; /* the Label table */
52 bucket *enumTab[256]; /* enumerated table */
54 /*------------------------------------------------------------------*/
55 /* initSymt () - initialises symbol table related stuff */
56 /*------------------------------------------------------------------*/
62 for (i = 0; i < 256; i++)
63 SymbolTab[i] = StructTab[i] = (void *) NULL;
67 /*-----------------------------------------------------------------*/
68 /* newBucket - allocates & returns a new bucket */
69 /*-----------------------------------------------------------------*/
75 bp = Safe_calloc (1, sizeof (bucket));
80 /*-----------------------------------------------------------------*/
81 /* hashKey - computes the hashkey given a symbol name */
82 /*-----------------------------------------------------------------*/
84 hashKey (const char *s)
86 unsigned long key = 0;
93 /*-----------------------------------------------------------------*/
94 /* addSym - adds a symbol to the hash Table */
95 /*-----------------------------------------------------------------*/
97 addSym (bucket ** stab,
104 int i; /* index into the hash Table */
105 bucket *bp; /* temp bucket * */
108 if (getenv("DEBUG_SANITY")) {
109 fprintf (stderr, "addSym: %s ", sname);
111 /* make sure the type is complete and sane */
112 checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
115 /* the symbols are always added at the head of the list */
117 /* get a free entry */
118 bp = Safe_calloc (1, sizeof (bucket));
120 bp->sym = sym; /* update the symbol pointer */
121 bp->level = level; /* update the nest level */
123 strcpy (bp->name, sname); /* copy the name into place */
125 /* if this is the first entry */
128 bp->prev = bp->next = (void *) NULL; /* point to nothing */
131 /* not first entry then add @ head of list */
141 /*-----------------------------------------------------------------*/
142 /* deleteSym - deletes a symbol from the hash Table entry */
143 /*-----------------------------------------------------------------*/
145 deleteSym (bucket ** stab, void *sym, char *sname)
153 /* find the symbol */
156 if (bp->sym == sym) /* found it then break out */
157 break; /* of the loop */
161 if (!bp) /* did not find it */
163 /* if this is the first one in the chain */
167 if (stab[i]) /* if chain ! empty */
168 stab[i]->prev = (void *) NULL;
170 /* middle || end of chain */
173 if (bp->next) /* if not end of chain */
174 bp->next->prev = bp->prev;
176 bp->prev->next = bp->next;
181 /*-----------------------------------------------------------------*/
182 /* findSym - finds a symbol in a table */
183 /*-----------------------------------------------------------------*/
185 findSym (bucket ** stab, void *sym, const char *sname)
189 bp = stab[hashKey (sname)];
192 if (bp->sym == sym || strcmp (bp->name, sname) == 0)
197 return (bp ? bp->sym : (void *) NULL);
200 /*-----------------------------------------------------------------*/
201 /* findSymWithLevel - finds a symbol with a name & level */
202 /*-----------------------------------------------------------------*/
204 findSymWithLevel (bucket ** stab, symbol * sym)
208 bp = stab[hashKey (sym->name)];
211 ** do the search from the head of the list since the
212 ** elements are added at the head it is ensured that
213 ** we will find the deeper definitions before we find
214 ** the global ones. we need to check for symbols with
215 ** level <= to the level given, if levels match then block
216 ** numbers need to match as well
221 if (strcmp (bp->name, sym->name) == 0 && bp->level <= sym->level)
223 /* if this is parameter then nothing else need to be checked */
224 if (((symbol *) (bp->sym))->_isparm)
226 /* if levels match then block numbers hsould also match */
227 if (bp->level && bp->level == sym->level && bp->block == sym->block)
229 /* if levels don't match then we are okay */
230 if (bp->level && bp->level != sym->level && bp->block <= sym->block)
232 /* if this is a global variable then we are ok too */
240 return (void *) NULL;
243 /*-----------------------------------------------------------------*/
244 /* findSymWithBlock - finds a symbol with name in with a block */
245 /*-----------------------------------------------------------------*/
247 findSymWithBlock (bucket ** stab, symbol * sym, int block)
251 bp = stab[hashKey (sym->name)];
254 if (strcmp (bp->name, sym->name) == 0 &&
260 return (bp ? bp->sym : (void *) NULL);
263 /*------------------------------------------------------------------*/
264 /* newSymbol () - returns a new pointer to a symbol */
265 /*------------------------------------------------------------------*/
267 newSymbol (char *name, int scope)
271 sym = Safe_calloc (1, sizeof (symbol));
273 strcpy (sym->name, name); /* copy the name */
274 sym->level = scope; /* set the level */
275 sym->block = currBlockno;
276 sym->lineDef = yylineno; /* set the line number */
280 /*------------------------------------------------------------------*/
281 /* newLink - creates a new link (declarator,specifier) */
282 /*------------------------------------------------------------------*/
288 p = Safe_calloc (1, sizeof (sym_link));
293 /*------------------------------------------------------------------*/
294 /* newStruct - creats a new structdef from the free list */
295 /*------------------------------------------------------------------*/
297 newStruct (char *tag)
301 s = Safe_calloc (1, sizeof (structdef));
303 strcpy (s->tag, tag); /* copy the tag */
307 /*------------------------------------------------------------------*/
308 /* pointerTypes - do the computation for the pointer types */
309 /*------------------------------------------------------------------*/
311 pointerTypes (sym_link * ptr, sym_link * type)
316 /* find the first pointer type */
317 while (ptr && !IS_PTR (ptr))
320 /* could not find it */
321 if (!ptr || IS_SPEC (ptr) ||
322 DCL_TYPE (ptr) != UPOINTER)
325 /* change the pointer type depending on the
326 storage class of the type */
329 DCL_PTR_CONST (ptr) = SPEC_CONST (type);
330 DCL_PTR_VOLATILE (ptr) = SPEC_VOLATILE (type);
331 switch (SPEC_SCLS (type))
334 DCL_TYPE (ptr) = FPOINTER;
337 DCL_TYPE (ptr) = IPOINTER;
340 DCL_TYPE (ptr) = PPOINTER;
343 DCL_TYPE (ptr) = POINTER;
346 DCL_PTR_CONST (ptr) = port->mem.code_ro;
347 DCL_TYPE (ptr) = CPOINTER;
350 DCL_TYPE (ptr) = EEPPOINTER;
353 DCL_TYPE (ptr) = GPOINTER;
356 /* the storage class of type ends here */
359 SPEC_VOLATILE (type) = 0;
362 /* now change all the remaining unknown pointers
363 to generic pointers */
366 if (!IS_SPEC (ptr) && DCL_TYPE (ptr) == UPOINTER)
367 DCL_TYPE (ptr) = GPOINTER;
371 /* same for the type although it is highly unlikely that
372 type will have a pointer */
375 if (!IS_SPEC (type) && DCL_TYPE (type) == UPOINTER)
376 DCL_TYPE (type) = GPOINTER;
382 /*------------------------------------------------------------------*/
383 /* addDecl - adds a declarator @ the end of a chain */
384 /*------------------------------------------------------------------*/
386 addDecl (symbol * sym, int type, sym_link * p)
392 /* if we are passed a link then set head & tail */
401 head = tail = newLink ();
402 DCL_TYPE (head) = type;
405 /* if this is the first entry */
413 if (IS_SPEC (sym->etype) && IS_SPEC (head) && head == tail)
415 sym->etype = mergeSpec (sym->etype, head, sym->name);
419 if (IS_SPEC (sym->etype) && !IS_SPEC (head) && head == tail)
422 while (t->next != sym->etype)
425 tail->next = sym->etype;
429 sym->etype->next = head;
435 /* if the type is a unknown pointer and has
436 a tspec then take the storage class const & volatile
437 attribute from the tspec & make it those of this
441 DCL_TYPE (p) == UPOINTER &&
444 if (!IS_SPEC (sym->etype))
446 sym->etype = sym->etype->next = newLink ();
447 sym->etype->class = SPECIFIER;
449 SPEC_SCLS (sym->etype) = SPEC_SCLS (DCL_TSPEC (p));
450 SPEC_CONST (sym->etype) = SPEC_CONST (DCL_TSPEC (p));
451 SPEC_VOLATILE (sym->etype) = SPEC_VOLATILE (DCL_TSPEC (p));
452 DCL_TSPEC (p) = NULL;
457 /*------------------------------------------------------------------
458 checkTypeSanity: prevent the user from doing e.g.:
460 ------------------------------------------------------------------*/
461 void checkTypeSanity(sym_link *etype, char *name) {
465 if (getenv("DEBUG_SANITY")) {
466 fprintf (stderr, "sanity check skipped for %s (etype==0)\n", name);
471 if (!IS_SPEC(etype)) {
472 if (getenv("DEBUG_SANITY")) {
473 fprintf (stderr, "sanity check skipped for %s (!IS_SPEC)\n", name);
478 noun=nounName(etype);
480 if (getenv("DEBUG_SANITY")) {
481 fprintf (stderr, "checking sanity for %s %x\n", name, (int)etype);
484 if ((SPEC_NOUN(etype)==V_CHAR ||
485 SPEC_NOUN(etype)==V_FLOAT ||
486 SPEC_NOUN(etype)==V_DOUBLE ||
487 SPEC_NOUN(etype)==V_VOID) &&
488 (etype->select.s._short || SPEC_LONG(etype))) {
489 // long or short for char float double or void
490 werror (E_LONG_OR_SHORT_INVALID, noun, name);
492 if ((SPEC_NOUN(etype)==V_FLOAT ||
493 SPEC_NOUN(etype)==V_DOUBLE ||
494 SPEC_NOUN(etype)==V_VOID) &&
495 (etype->select.s._signed || SPEC_USIGN(etype))) {
496 // signed or unsigned for float double or void
497 werror (E_SIGNED_OR_UNSIGNED_INVALID, noun, name);
500 // special case for "short"
501 if (etype->select.s._short) {
502 SPEC_NOUN(etype) = options.shortis8bits ? V_CHAR : V_INT;
503 etype->select.s._short = 0;
507 "const a;" or "data b;" or "signed s" or "long l"
509 if (!SPEC_NOUN(etype)) {
510 SPEC_NOUN(etype)=V_INT;
513 if (etype->select.s._signed && SPEC_USIGN(etype)) {
514 // signed AND unsigned
515 werror (E_SIGNED_AND_UNSIGNED_INVALID, noun, name);
517 if (etype->select.s._short && SPEC_LONG(etype)) {
519 werror (E_LONG_AND_SHORT_INVALID, noun, name);
524 /*------------------------------------------------------------------*/
525 /* mergeSpec - merges two specifiers and returns the new one */
526 /*------------------------------------------------------------------*/
527 #define LAST_MINUTE_2_3_0_FIX
529 mergeSpec (sym_link * dest, sym_link * src, char *name)
532 #ifdef LAST_MINUTE_2_3_0_FIX
535 if (!IS_SPEC(dest)) {
536 // This should not happen
537 fprintf (stderr, "*** internal error: can't merge declarators\n");
540 // here we have a declarator as source, reverse them
544 while (!IS_SPEC(dest)) {
545 // and find the specifier
553 if (getenv("DEBUG_mergeSpec")) {
554 fprintf (stderr, "mergeSpec: \"%s\"\n", name);
557 if (SPEC_NOUN(src)) {
558 if (!SPEC_NOUN(dest)) {
559 SPEC_NOUN(dest)=SPEC_NOUN(src);
561 /* we shouldn't redeclare the type */
562 if (getenv("DEBUG_SANITY")) {
563 fprintf (stderr, "mergeSpec: ");
565 werror(E_TWO_OR_MORE_DATA_TYPES, name);
569 if (SPEC_SCLS(src)) {
570 /* if destination has no storage class */
571 if (!SPEC_SCLS (dest) || SPEC_SCLS(dest)==S_REGISTER) {
572 SPEC_SCLS (dest) = SPEC_SCLS (src);
574 if (getenv("DEBUG_SANITY")) {
575 fprintf (stderr, "mergeSpec: ");
577 werror(E_TWO_OR_MORE_STORAGE_CLASSES, name);
581 /* copy all the specifications */
583 // we really should do:
585 if (SPEC_what(src)) {
586 if (SPEC_what(dest)) {
587 werror(W_DUPLICATE_SPEC, "what");
589 SPEC_what(dst)|=SPEC_what(src);
592 // but there are more important thing right now
594 SPEC_LONG (dest) |= SPEC_LONG (src);
595 dest->select.s._short|=src->select.s._short;
596 SPEC_USIGN (dest) |= SPEC_USIGN (src);
597 dest->select.s._signed|=src->select.s._signed;
598 SPEC_STAT (dest) |= SPEC_STAT (src);
599 SPEC_EXTR (dest) |= SPEC_EXTR (src);
600 SPEC_ABSA (dest) |= SPEC_ABSA (src);
601 SPEC_RENT (dest) |= SPEC_RENT (src);
602 SPEC_INTN (dest) |= SPEC_INTN (src);
603 SPEC_BANK (dest) |= SPEC_BANK (src);
604 SPEC_VOLATILE (dest) |= SPEC_VOLATILE (src);
605 SPEC_CRTCL (dest) |= SPEC_CRTCL (src);
606 SPEC_ADDR (dest) |= SPEC_ADDR (src);
607 SPEC_OCLS (dest) = SPEC_OCLS (src);
608 SPEC_BLEN (dest) |= SPEC_BLEN (src);
609 SPEC_BSTR (dest) |= SPEC_BSTR (src);
610 SPEC_TYPEDEF (dest) |= SPEC_TYPEDEF (src);
611 SPEC_NONBANKED (dest) |= SPEC_NONBANKED (src);
612 SPEC_NAKED (dest) |= SPEC_NAKED (src);
614 if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL)
615 SPEC_STRUCT (dest) = SPEC_STRUCT (src);
617 #ifdef LAST_MINUTE_2_3_0_FIX
624 /*------------------------------------------------------------------*/
625 /* cloneSpec - copies the entire spec and returns a new spec */
626 /*------------------------------------------------------------------*/
628 cloneSpec (sym_link * src)
632 /* go thru chain till we find the specifier */
633 while (src && src->class != SPECIFIER)
637 memcpy (spec, src, sizeof (sym_link));
641 /*------------------------------------------------------------------*/
642 /* genSymName - generates and returns a name used for anonymous vars */
643 /*------------------------------------------------------------------*/
645 genSymName (int level)
647 static int gCount = 0;
648 static char gname[SDCC_NAME_MAX + 1];
650 sprintf (gname, "__%04d%04d", level, gCount++);
654 /*------------------------------------------------------------------*/
655 /* getSpec - returns the specifier part from a declaration chain */
656 /*------------------------------------------------------------------*/
658 getSpec (sym_link * p)
663 while (p && !(IS_SPEC (p)))
669 /*------------------------------------------------------------------*/
670 /* newCharLink() - creates an char type */
671 /*------------------------------------------------------------------*/
678 p->class = SPECIFIER;
679 SPEC_NOUN (p) = V_CHAR;
684 /*------------------------------------------------------------------*/
685 /* newFloatLink - a new Float type */
686 /*------------------------------------------------------------------*/
693 p->class = SPECIFIER;
694 SPEC_NOUN (p) = V_FLOAT;
699 /*------------------------------------------------------------------*/
700 /* newLongLink() - new long type */
701 /*------------------------------------------------------------------*/
708 p->class = SPECIFIER;
709 SPEC_NOUN (p) = V_INT;
715 /*------------------------------------------------------------------*/
716 /* newIntLink() - creates an int type */
717 /*------------------------------------------------------------------*/
724 p->class = SPECIFIER;
725 SPEC_NOUN (p) = V_INT;
730 /*------------------------------------------------------------------*/
731 /* getSize - returns size of a type chain in bits */
732 /*------------------------------------------------------------------*/
734 getSize (sym_link * p)
736 /* if nothing return 0 */
740 { /* if this is the specifier then */
741 switch (SPEC_NOUN (p))
742 { /* depending on the specifier type */
744 return (IS_LONG (p) ? LONGSIZE : INTSIZE);
752 return SPEC_STRUCT (p)->size;
758 return ((SPEC_BLEN (p) / 8) + (SPEC_BLEN (p) % 8 ? 1 : 0));
764 /* this is a specifier */
765 switch (DCL_TYPE (p))
770 return DCL_ELEM (p) * getSize (p->next);
787 /*------------------------------------------------------------------*/
788 /* bitsForType - returns # of bits required to store this type */
789 /*------------------------------------------------------------------*/
791 bitsForType (sym_link * p)
793 /* if nothing return 0 */
798 { /* if this is the specifier then */
800 switch (SPEC_NOUN (p))
801 { /* depending on the specifier type */
803 return (IS_LONG (p) ? LONGSIZE * 8 : INTSIZE * 8);
805 return FLOATSIZE * 8;
811 return SPEC_STRUCT (p)->size * 8;
817 return SPEC_BLEN (p);
823 /* this is a specifier */
824 switch (DCL_TYPE (p))
829 return DCL_ELEM (p) * getSize (p->next) * 8;
833 return (PTRSIZE * 8);
837 return (FPTRSIZE * 8);
839 return (GPTRSIZE * 8);
846 /*------------------------------------------------------------------*/
847 /* copySymbolChain - copies a symbol chain */
848 /*------------------------------------------------------------------*/
850 copySymbolChain (symbol * src)
857 dest = copySymbol (src);
858 dest->next = copySymbolChain (src->next);
862 /*------------------------------------------------------------------*/
863 /* copySymbol - makes a copy of a symbol */
864 /*------------------------------------------------------------------*/
866 copySymbol (symbol * src)
873 dest = newSymbol (src->name, src->level);
874 memcpy (dest, src, sizeof (symbol));
875 dest->level = src->level;
876 dest->block = src->block;
877 dest->ival = copyIlist (src->ival);
878 dest->type = copyLinkChain (src->type);
879 dest->etype = getSpec (dest->type);
881 dest->args = copyValueChain (src->args);
882 dest->key = src->key;
883 dest->calleeSave = src->calleeSave;
884 dest->allocreq = src->allocreq;
888 /*------------------------------------------------------------------*/
889 /* reverseSyms - reverses the links for a symbol chain */
890 /*------------------------------------------------------------------*/
892 reverseSyms (symbol * sym)
894 symbol *prev, *curr, *next;
909 sym->next = (void *) NULL;
913 /*------------------------------------------------------------------*/
914 /* reverseLink - reverses the links for a type chain */
915 /*------------------------------------------------------------------*/
917 reverseLink (sym_link * type)
919 sym_link *prev, *curr, *next;
934 type->next = (void *) NULL;
938 /*------------------------------------------------------------------*/
939 /* addSymChain - adds a symbol chain to the symboltable */
940 /*------------------------------------------------------------------*/
942 addSymChain (symbol * symHead)
944 symbol *sym = symHead;
946 int bothSymbolsExtern;
949 for (; sym != NULL; sym = sym->next)
953 /* if already exists in the symbol table then check if
954 one of them is an extern definition if yes then
955 then check if the type match, if the types match then
956 delete the current entry and add the new entry */
957 if ((csym = findSymWithLevel (SymbolTab, sym)) &&
958 csym->level == sym->level)
961 /* one definition extern ? */
962 if (IS_EXTERN (csym->etype) || IS_EXTERN (sym->etype))
965 IS_EXTERN (csym->etype) && IS_EXTERN (sym->etype);
966 /* do types match ? */
967 if (compareType (csym->type, sym->type) != 1)
969 werror (E_DUPLICATE, csym->name);
971 /* delete current entry */
972 deleteSym (SymbolTab, csym, csym->name);
974 /* this isn't really needed, but alla */
975 sym->etype->select.s._extern=bothSymbolsExtern;
978 addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1);
980 else /* not extern */
981 werror (E_DUPLICATE, sym->name);
985 /* check if previously defined */
986 if (csym && csym->level == sym->level)
988 /* if the previous one was declared as extern */
989 /* then check the type with the current one */
990 if (IS_EXTERN (csym->etype))
992 if (compareType (csym->type, sym->type) <= 0)
993 werror (W_EXTERN_MISMATCH, csym->name);
996 addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1);
1001 /*------------------------------------------------------------------*/
1002 /* funcInChain - DCL Type 'FUNCTION' found in type chain */
1003 /*------------------------------------------------------------------*/
1005 funcInChain (sym_link * lnk)
1016 /*------------------------------------------------------------------*/
1017 /* structElemType - returns the type info of a sturct member */
1018 /*------------------------------------------------------------------*/
1020 structElemType (sym_link * stype, value * id, value ** argsp)
1022 symbol *fields = (SPEC_STRUCT (stype) ? SPEC_STRUCT (stype)->fields : NULL);
1023 sym_link *type, *etype;
1024 sym_link *petype = getSpec (stype);
1029 /* look for the id */
1032 if (strcmp (fields->rname, id->name) == 0)
1036 *argsp = fields->args;
1038 type = copyLinkChain (fields->type);
1039 etype = getSpec (type);
1040 SPEC_SCLS (etype) = (SPEC_SCLS (petype) == S_REGISTER ?
1041 SPEC_SCLS (etype) : SPEC_SCLS (petype));
1044 fields = fields->next;
1046 werror (E_NOT_MEMBER, id->name);
1051 /*------------------------------------------------------------------*/
1052 /* getStructElement - returns element of a tructure definition */
1053 /*------------------------------------------------------------------*/
1055 getStructElement (structdef * sdef, symbol * sym)
1059 for (field = sdef->fields; field; field = field->next)
1060 if (strcmp (field->name, sym->name) == 0)
1063 werror (E_NOT_MEMBER, sym->name);
1065 return sdef->fields;
1068 /*------------------------------------------------------------------*/
1069 /* compStructSize - computes the size of a structure */
1070 /*------------------------------------------------------------------*/
1072 compStructSize (int su, structdef * sdef)
1074 int sum = 0, usum = 0;
1078 /* for the identifiers */
1079 loop = sdef->fields;
1082 /* create the internal name for this variable */
1083 sprintf (loop->rname, "_%s", loop->name);
1084 loop->offset = (su == UNION ? sum = 0 : sum);
1085 SPEC_VOLATILE (loop->etype) |= (su == UNION ? 1 : 0);
1087 /* if this is a bit field */
1090 /* change it to a unsigned bit */
1091 SPEC_NOUN (loop->etype) = V_BIT;
1092 SPEC_USIGN (loop->etype) = 1;
1093 /* check if this fit into the remaining */
1094 /* bits of this byte else align it to the */
1095 /* next byte boundary */
1096 if ((SPEC_BLEN (loop->etype) = loop->bitVar) <= (8 - bitOffset)) {
1097 SPEC_BSTR (loop->etype) = bitOffset;
1098 if ((bitOffset += (loop->bitVar % 8)) == 8)
1101 else /* does not fit */ {
1103 SPEC_BSTR (loop->etype) = bitOffset;
1104 sum += (loop->bitVar / 8);
1105 bitOffset += (loop->bitVar % 8);
1107 /* if this is the last field then pad */
1108 if (!loop->next && bitOffset && bitOffset != 8) {
1115 sum += getSize (loop->type);
1118 /* if function then do the arguments for it */
1119 if (funcInChain (loop->type)) {
1120 processFuncArgs (loop, 1);
1125 /* if this is not a bitfield but the */
1126 /* previous one was and did not take */
1127 /* the whole byte then pad the rest */
1128 if ((loop && !loop->bitVar) && bitOffset) {
1133 /* if union then size = sizeof larget field */
1135 usum = max (usum, sum);
1139 return (su == UNION ? usum : sum);
1142 /*------------------------------------------------------------------*/
1143 /* checkSClass - check the storage class specification */
1144 /*------------------------------------------------------------------*/
1146 checkSClass (symbol * sym)
1148 if (getenv("DEBUG_SANITY")) {
1149 fprintf (stderr, "checkSClass: %s \n", sym->name);
1151 if (strcmp(sym->name, "_testsGlobal")==0) {
1155 /* type is literal can happen foe enums change
1157 if (SPEC_SCLS (sym->etype) == S_LITERAL && !SPEC_ENUM (sym->etype))
1158 SPEC_SCLS (sym->etype) = S_AUTO;
1160 /* if sfr or sbit then must also be */
1161 /* volatile the initial value will be xlated */
1162 /* to an absolute address */
1163 if (SPEC_SCLS (sym->etype) == S_SBIT ||
1164 SPEC_SCLS (sym->etype) == S_SFR)
1166 SPEC_VOLATILE (sym->etype) = 1;
1167 /* if initial value given */
1170 SPEC_ABSA (sym->etype) = 1;
1171 SPEC_ADDR (sym->etype) =
1172 (int) list2int (sym->ival);
1177 /* if absolute address given then it mark it as
1179 if (IS_ABSOLUTE (sym->etype))
1180 SPEC_VOLATILE (sym->etype) = 1;
1182 /* global variables declared const put into code */
1183 if (sym->level == 0 &&
1184 SPEC_CONST (sym->etype)) {
1185 SPEC_SCLS (sym->etype) = S_CODE;
1188 /* global variable in code space is a constant */
1189 if (sym->level == 0 &&
1190 SPEC_SCLS (sym->etype) == S_CODE &&
1192 SPEC_CONST (sym->etype) = 1;
1195 /* if bit variable then no storage class can be */
1196 /* specified since bit is already a storage */
1197 if (IS_BITVAR (sym->etype) &&
1198 (SPEC_SCLS (sym->etype) != S_FIXED &&
1199 SPEC_SCLS (sym->etype) != S_SBIT &&
1200 SPEC_SCLS (sym->etype) != S_BIT)
1203 werror (E_BITVAR_STORAGE, sym->name);
1204 SPEC_SCLS (sym->etype) = S_FIXED;
1207 /* extern variables cannot be initialized */
1208 if (IS_EXTERN (sym->etype) && sym->ival)
1210 werror (E_EXTERN_INIT, sym->name);
1215 /* if this is an automatic symbol then */
1216 /* storage class will be ignored and */
1217 /* symbol will be allocated on stack/ */
1218 /* data depending on flag */
1220 (options.stackAuto || reentrant) &&
1221 (SPEC_SCLS (sym->etype) != S_AUTO &&
1222 SPEC_SCLS (sym->etype) != S_FIXED &&
1223 SPEC_SCLS (sym->etype) != S_REGISTER &&
1224 SPEC_SCLS (sym->etype) != S_STACK &&
1225 SPEC_SCLS (sym->etype) != S_XSTACK))
1227 werror (E_AUTO_ASSUMED, sym->name);
1228 SPEC_SCLS (sym->etype) = S_AUTO;
1231 /* if this is an atomatic symbol */
1232 if (sym->level && (options.stackAuto || reentrant)) {
1233 if ((SPEC_SCLS (sym->etype) == S_AUTO ||
1234 SPEC_SCLS (sym->etype) == S_FIXED ||
1235 SPEC_SCLS (sym->etype) == S_REGISTER ||
1236 SPEC_SCLS (sym->etype) == S_STACK ||
1237 SPEC_SCLS (sym->etype) == S_XSTACK)) {
1238 SPEC_SCLS (sym->etype) = S_AUTO;
1240 /* storage class may only be specified for statics */
1241 if (!IS_STATIC(sym->etype)) {
1242 werror (E_AUTO_ASSUMED, sym->name);
1248 /* automatic symbols cannot be given */
1249 /* an absolute address ignore it */
1251 SPEC_ABSA (sym->etype) &&
1252 (options.stackAuto || reentrant))
1254 werror (E_AUTO_ABSA, sym->name);
1255 SPEC_ABSA (sym->etype) = 0;
1258 /* arrays & pointers cannot be defined for bits */
1259 /* SBITS or SFRs or BIT */
1260 if ((IS_ARRAY (sym->type) || IS_PTR (sym->type)) &&
1261 (SPEC_NOUN (sym->etype) == V_BIT ||
1262 SPEC_NOUN (sym->etype) == V_SBIT ||
1263 SPEC_SCLS (sym->etype) == S_SFR))
1264 werror (E_BIT_ARRAY, sym->name);
1266 /* if this is a bit|sbit then set length & start */
1267 if (SPEC_NOUN (sym->etype) == V_BIT ||
1268 SPEC_NOUN (sym->etype) == V_SBIT)
1270 SPEC_BLEN (sym->etype) = 1;
1271 SPEC_BSTR (sym->etype) = 0;
1274 /* variables declared in CODE space must have */
1275 /* initializers if not an extern */
1276 if (SPEC_SCLS (sym->etype) == S_CODE &&
1277 sym->ival == NULL &&
1279 port->mem.code_ro &&
1280 !IS_EXTERN (sym->etype) &&
1281 !funcInChain (sym->type))
1282 werror (E_CODE_NO_INIT, sym->name);
1284 /* if parameter or local variable then change */
1285 /* the storage class to reflect where the var will go */
1286 if (sym->level && SPEC_SCLS (sym->etype) == S_FIXED &&
1287 !IS_STATIC(sym->etype))
1289 if (options.stackAuto || (currFunc && IS_RENT (currFunc->etype)))
1291 SPEC_SCLS (sym->etype) = (options.useXstack ?
1292 S_XSTACK : S_STACK);
1296 /* hack-o-matic! I see no reason why the useXstack option should ever
1297 * control this allcoation, but the code was originally that way, and
1298 * changing it for non-390 ports breaks the compiler badly.
1300 bool useXdata = TARGET_IS_DS390 ? 1 : options.useXstack;
1301 SPEC_SCLS (sym->etype) = (useXdata ?
1307 /*------------------------------------------------------------------*/
1308 /* changePointer - change pointer to functions */
1309 /*------------------------------------------------------------------*/
1311 changePointer (symbol * sym)
1315 /* go thru the chain of declarations */
1316 /* if we find a pointer to a function */
1317 /* unconditionally change it to a ptr */
1319 for (p = sym->type; p; p = p->next)
1321 if (!IS_SPEC (p) && DCL_TYPE (p) == UPOINTER)
1322 DCL_TYPE (p) = GPOINTER;
1323 if (IS_PTR (p) && IS_FUNC (p->next))
1324 DCL_TYPE (p) = CPOINTER;
1328 /*------------------------------------------------------------------*/
1329 /* checkDecl - does semantic validation of a declaration */
1330 /*------------------------------------------------------------------*/
1332 checkDecl (symbol * sym)
1335 checkSClass (sym); /* check the storage class */
1336 changePointer (sym); /* change pointers if required */
1338 /* if this is an array without any dimension
1339 then update the dimension from the initial value */
1340 if (IS_ARRAY (sym->type) && !DCL_ELEM (sym->type))
1341 DCL_ELEM (sym->type) = getNelements (sym->type, sym->ival);
1346 /*------------------------------------------------------------------*/
1347 /* copyLinkChain - makes a copy of the link chain & rets ptr 2 head */
1348 /*------------------------------------------------------------------*/
1350 copyLinkChain (sym_link * p)
1352 sym_link *head, *curr, *loop;
1355 head = loop = (curr ? newLink () : (void *) NULL);
1358 memcpy (loop, curr, sizeof (sym_link)); /* copy it */
1359 loop->next = (curr->next ? newLink () : (void *) NULL);
1368 /*------------------------------------------------------------------*/
1369 /* cleanUpBlock - cleansup the symbol table specified for all the */
1370 /* symbols in the given block */
1371 /*------------------------------------------------------------------*/
1373 cleanUpBlock (bucket ** table, int block)
1378 /* go thru the entire table */
1379 for (i = 0; i < 256; i++)
1381 for (chain = table[i]; chain; chain = chain->next)
1383 if (chain->block >= block)
1385 deleteSym (table, chain->sym, chain->name);
1391 /*------------------------------------------------------------------*/
1392 /* cleanUpLevel - cleansup the symbol table specified for all the */
1393 /* symbols in the given level */
1394 /*------------------------------------------------------------------*/
1396 cleanUpLevel (bucket ** table, int level)
1401 /* go thru the entire table */
1402 for (i = 0; i < 256; i++)
1404 for (chain = table[i]; chain; chain = chain->next)
1406 if (chain->level >= level)
1408 deleteSym (table, chain->sym, chain->name);
1414 /*------------------------------------------------------------------*/
1415 /* computeType - computes the resultant type from two types */
1416 /*------------------------------------------------------------------*/
1418 computeType (sym_link * type1, sym_link * type2)
1422 sym_link *etype1 = getSpec (type1);
1423 sym_link *etype2 = getSpec (type2);
1425 /* if one of them is a float then result is a float */
1426 /* here we assume that the types passed are okay */
1427 /* and can be cast to one another */
1428 /* which ever is greater in size */
1429 if (IS_FLOAT (etype1) || IS_FLOAT (etype2))
1430 rType = newFloatLink ();
1432 /* if only one of them is a bit variable
1433 then the other one prevails */
1434 if (IS_BITVAR (etype1) && !IS_BITVAR (etype2))
1435 rType = copyLinkChain (type2);
1436 else if (IS_BITVAR (etype2) && !IS_BITVAR (etype1))
1437 rType = copyLinkChain (type1);
1439 /* if one of them is a pointer then that
1442 rType = copyLinkChain (type1);
1443 else if (IS_PTR (type2))
1444 rType = copyLinkChain (type2);
1445 else if (getSize (type1) > getSize (type2))
1446 rType = copyLinkChain (type1);
1448 rType = copyLinkChain (type2);
1450 reType = getSpec (rType);
1452 /* if either of them unsigned then make this unsigned */
1453 if ((SPEC_USIGN (etype1) || SPEC_USIGN (etype2)) && !IS_FLOAT (reType))
1454 SPEC_USIGN (reType) = 1;
1456 /* if result is a literal then make not so */
1457 if (IS_LITERAL (reType))
1458 SPEC_SCLS (reType) = S_REGISTER;
1463 /*------------------------------------------------------------------*/
1464 /* compareType - will do type check return 1 if match */
1465 /*------------------------------------------------------------------*/
1467 compareType (sym_link * dest, sym_link * src)
1478 /* if dest is a declarator then */
1483 if (DCL_TYPE (src) == DCL_TYPE (dest))
1484 return compareType (dest->next, src->next);
1485 else if (IS_PTR (src) && IS_PTR (dest))
1487 else if (IS_PTR (dest) && IS_ARRAY (src))
1489 else if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
1490 return -1 * compareType (dest->next, src);
1494 else if (IS_PTR (dest) && IS_INTEGRAL (src))
1500 /* if one is a specifier and the other is not */
1501 if ((IS_SPEC (src) && !IS_SPEC (dest)) ||
1502 (IS_SPEC (dest) && !IS_SPEC (src)))
1505 /* if one of them is a void then ok */
1506 if (SPEC_NOUN (dest) == V_VOID &&
1507 SPEC_NOUN (src) != V_VOID)
1510 if (SPEC_NOUN (dest) != V_VOID &&
1511 SPEC_NOUN (src) == V_VOID)
1514 /* if they are both bitfields then if the lengths
1515 and starts don't match */
1516 if (IS_BITFIELD (dest) && IS_BITFIELD (src) &&
1517 (SPEC_BLEN (dest) != SPEC_BLEN (src) ||
1518 SPEC_BSTR (dest) != SPEC_BSTR (src)))
1521 /* it is a specifier */
1522 if (SPEC_NOUN (dest) != SPEC_NOUN (src))
1524 if (SPEC_USIGN (dest) == SPEC_USIGN (src) &&
1525 IS_INTEGRAL (dest) && IS_INTEGRAL (src) &&
1526 getSize (dest) == getSize (src))
1528 else if (IS_ARITHMETIC (dest) && IS_ARITHMETIC (src))
1533 else if (IS_STRUCT (dest))
1535 if (SPEC_STRUCT (dest) != SPEC_STRUCT (src))
1540 if (SPEC_LONG (dest) != SPEC_LONG (src))
1543 if (SPEC_USIGN (dest) != SPEC_USIGN (src))
1549 /*------------------------------------------------------------------*/
1550 /* inCalleeSaveList - return 1 if found in callee save list */
1551 /*------------------------------------------------------------------*/
1553 inCalleeSaveList (char *s)
1557 for (i = 0; options.calleeSaves[i]; i++)
1558 if (strcmp (options.calleeSaves[i], s) == 0)
1564 /*-----------------------------------------------------------------*/
1565 /* aggregateArgToPointer: change an agggregate type function */
1566 /* argument to a pointer to that type. */
1567 /*-----------------------------------------------------------------*/
1569 aggregateArgToPointer (value * val)
1571 if (IS_AGGREGATE (val->type))
1573 /* if this is a structure */
1574 /* then we need to add a new link */
1575 if (IS_STRUCT (val->type))
1577 /* first lets add DECLARATOR type */
1578 sym_link *p = val->type;
1580 werror (W_STRUCT_AS_ARG, val->name);
1581 val->type = newLink ();
1582 val->type->next = p;
1585 /* change to a pointer depending on the */
1586 /* storage class specified */
1587 switch (SPEC_SCLS (val->etype))
1590 DCL_TYPE (val->type) = IPOINTER;
1593 DCL_TYPE (val->type) = PPOINTER;
1596 if (TARGET_IS_DS390)
1598 /* The AUTO and REGISTER classes should probably
1599 * also become generic pointers, but I haven't yet
1600 * devised a test case for that.
1602 DCL_TYPE (val->type) = GPOINTER;
1609 DCL_TYPE (val->type) = POINTER;
1612 DCL_TYPE (val->type) = CPOINTER;
1615 DCL_TYPE (val->type) = FPOINTER;
1618 DCL_TYPE (val->type) = EEPPOINTER;
1621 DCL_TYPE (val->type) = GPOINTER;
1624 /* is there is a symbol associated then */
1625 /* change the type of the symbol as well */
1628 val->sym->type = copyLinkChain (val->type);
1629 val->sym->etype = getSpec (val->sym->type);
1633 /*------------------------------------------------------------------*/
1634 /* checkFunction - does all kinds of check on a function */
1635 /*------------------------------------------------------------------*/
1637 checkFunction (symbol * sym)
1640 value *exargs, *acargs;
1644 if (getenv("DEBUG_SANITY")) {
1645 fprintf (stderr, "checkFunction: %s ", sym->name);
1648 /* make sure the type is complete and sane */
1649 checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
1651 /* if not type then some kind of error */
1655 /* if the function has no type then make it return int */
1656 if (!sym->type->next)
1657 sym->type->next = sym->etype = newIntLink ();
1659 /* function cannot return aggregate */
1660 if (IS_AGGREGATE (sym->type->next))
1662 werror (E_FUNC_AGGR, sym->name);
1666 /* function cannot return bit */
1667 if (IS_BITVAR (sym->type->next))
1669 werror (E_FUNC_BIT, sym->name);
1673 /* check if this function is defined as calleeSaves
1674 then mark it as such */
1675 sym->calleeSave = inCalleeSaveList (sym->name);
1677 /* if interrupt service routine */
1678 /* then it cannot have arguments */
1679 if (sym->args && IS_ISR (sym->etype) && !IS_VOID (sym->args->type))
1681 werror (E_INT_ARGS, sym->name);
1685 if (!(csym = findSym (SymbolTab, sym, sym->name)))
1686 return 1; /* not defined nothing more to check */
1688 /* check if body already present */
1689 if (csym && csym->fbody)
1691 werror (E_FUNC_BODY, sym->name);
1695 /* check the return value type */
1696 if (compareType (csym->type, sym->type) <= 0)
1698 werror (E_PREV_DEF_CONFLICT, csym->name, "type");
1699 werror (E_CONTINUE, "previous definition type ");
1700 printTypeChain (csym->type, stderr);
1701 fprintf (stderr, "\n");
1702 werror (E_CONTINUE, "current definition type ");
1703 printTypeChain (sym->type, stderr);
1704 fprintf (stderr, "\n");
1708 if (SPEC_INTRTN (csym->etype) != SPEC_INTRTN (sym->etype))
1710 werror (E_PREV_DEF_CONFLICT, csym->name, "interrupt");
1713 if (SPEC_BANK (csym->etype) != SPEC_BANK (sym->etype))
1715 werror (E_PREV_DEF_CONFLICT, csym->name, "using");
1718 if (SPEC_NAKED (csym->etype) != SPEC_NAKED (sym->etype))
1720 werror (E_PREV_DEF_CONFLICT, csym->name, "_naked");
1723 /* compare expected agrs with actual args */
1724 exargs = csym->args;
1727 /* for all the expected args do */
1730 exargs = exargs->next, acargs = acargs->next, argCnt++)
1732 if (getenv("DEBUG_SANITY")) {
1733 fprintf (stderr, "checkFunction: %s ", exargs->name);
1735 /* make sure the type is complete and sane */
1736 checkTypeSanity(exargs->etype, exargs->name);
1738 /* If the actual argument is an array, any prototype
1739 * will have modified it to a pointer. Duplicate that
1742 if (IS_AGGREGATE (acargs->type))
1744 checkValue = copyValue (acargs);
1745 aggregateArgToPointer (checkValue);
1749 checkValue = acargs;
1752 if (compareType (exargs->type, checkValue->type) <= 0)
1754 werror (E_ARG_TYPE, argCnt);
1759 /* if one them ended we have a problem */
1760 if ((exargs && !acargs && !IS_VOID (exargs->type)) ||
1761 (!exargs && acargs && !IS_VOID (acargs->type)))
1762 werror (E_ARG_COUNT);
1764 /* replace with this defition */
1765 sym->cdef = csym->cdef;
1766 deleteSym (SymbolTab, csym, csym->name);
1767 addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1);
1768 if (IS_EXTERN (csym->etype) && !
1769 IS_EXTERN (sym->etype))
1771 addSet (&publics, sym);
1776 /*-----------------------------------------------------------------*/
1777 /* processFuncArgs - does some processing with function args */
1778 /*-----------------------------------------------------------------*/
1780 processFuncArgs (symbol * func, int ignoreName)
1785 /* if this function has variable argument list */
1786 /* then make the function a reentrant one */
1788 SPEC_RENT (func->etype) = 1;
1790 /* check if this function is defined as calleeSaves
1791 then mark it as such */
1792 func->calleeSave = inCalleeSaveList (func->name);
1794 val = func->args; /* loop thru all the arguments */
1796 /* if it is void then remove parameters */
1797 if (val && IS_VOID (val->type))
1803 /* reset regparm for the port */
1804 (*port->reset_regparms) ();
1805 /* if any of the arguments is an aggregate */
1806 /* change it to pointer to the same type */
1809 /* mark it as a register parameter if
1810 the function does not have VA_ARG
1811 and as port dictates */
1812 if (!func->hasVargs &&
1813 (*port->reg_parm) (val->type))
1815 SPEC_REGPARM (val->etype) = 1;
1818 if (IS_AGGREGATE (val->type))
1820 aggregateArgToPointer (val);
1826 /* if this is an internal generated function call */
1828 /* ignore --stack-auto for this one, we don't know how it is compiled */
1829 /* simply trust on --int-long-reent or --float-reent */
1830 if (IS_RENT(func->etype)) {
1834 /* if this function is reentrant or */
1835 /* automatics r 2b stacked then nothing */
1836 if (IS_RENT (func->etype) || options.stackAuto)
1845 /* if a symbolname is not given */
1846 /* synthesize a variable name */
1850 sprintf (val->name, "_%s_PARM_%d", func->name, pNum++);
1851 val->sym = newSymbol (val->name, 1);
1852 SPEC_OCLS (val->etype) = port->mem.default_local_map;
1853 val->sym->type = copyLinkChain (val->type);
1854 val->sym->etype = getSpec (val->sym->type);
1855 val->sym->_isparm = 1;
1856 strcpy (val->sym->rname, val->name);
1857 SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
1858 SPEC_STAT (func->etype);
1859 addSymChain (val->sym);
1862 else /* symbol name given create synth name */
1865 sprintf (val->name, "_%s_PARM_%d", func->name, pNum++);
1866 strcpy (val->sym->rname, val->name);
1867 val->sym->_isparm = 1;
1868 SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) =
1869 (options.model != MODEL_SMALL ? xdata : data);
1870 SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
1871 SPEC_STAT (func->etype);
1877 /*-----------------------------------------------------------------*/
1878 /* isSymbolEqual - compares two symbols return 1 if they match */
1879 /*-----------------------------------------------------------------*/
1881 isSymbolEqual (symbol * dest, symbol * src)
1883 /* if pointers match then equal */
1887 /* if one of them is null then don't match */
1891 /* if both of them have rname match on rname */
1892 if (dest->rname[0] && src->rname[0])
1893 return (!strcmp (dest->rname, src->rname));
1895 /* otherwise match on name */
1896 return (!strcmp (dest->name, src->name));
1899 void PT(sym_link *type)
1901 printTypeChain(type,0);
1903 /*-----------------------------------------------------------------*/
1904 /* printTypeChain - prints the type chain in human readable form */
1905 /*-----------------------------------------------------------------*/
1907 printTypeChain (sym_link * type, FILE * of)
1921 if (DCL_PTR_VOLATILE(type)) {
1922 fprintf (of, "volatile ");
1924 switch (DCL_TYPE (type))
1927 fprintf (of, "function ");
1930 fprintf (of, "_generic * ");
1931 if (DCL_PTR_CONST (type))
1932 fprintf (of, "const ");
1935 fprintf (of, "_code * ");
1936 if (DCL_PTR_CONST (type))
1937 fprintf (of, "const ");
1940 fprintf (of, "_far * ");
1941 if (DCL_PTR_CONST (type))
1942 fprintf (of, "const ");
1945 fprintf (of, "_eeprom * ");
1946 if (DCL_PTR_CONST (type))
1947 fprintf (of, "const ");
1951 fprintf (of, "_near * ");
1952 if (DCL_PTR_CONST (type))
1953 fprintf (of, "const ");
1956 fprintf (of, "_idata *");
1957 if (DCL_PTR_CONST (type))
1958 fprintf (of, "const ");
1961 fprintf (of, "_pdata *");
1962 if (DCL_PTR_CONST (type))
1963 fprintf (of, "const ");
1966 fprintf (of, " _unkown *");
1967 if (DCL_PTR_CONST (type))
1968 fprintf (of, "const ");
1971 fprintf (of, "array of ");
1977 if (SPEC_VOLATILE (type))
1978 fprintf (of, "volatile ");
1979 if (SPEC_USIGN (type))
1980 fprintf (of, "unsigned ");
1981 if (SPEC_CONST (type))
1982 fprintf (of, "const ");
1984 switch (SPEC_NOUN (type))
1988 fprintf (of, "long ");
1989 fprintf (of, "int ");
1993 fprintf (of, "char ");
1997 fprintf (of, "void ");
2001 fprintf (of, "float ");
2005 fprintf (of, "struct %s", SPEC_STRUCT (type)->tag);
2009 fprintf (of, "sbit ");
2013 fprintf (of, "bit {%d,%d}", SPEC_BSTR (type), SPEC_BLEN (type));
2017 fprintf (of, "double ");
2021 fprintf (of, "unknown type ");
2031 /*-----------------------------------------------------------------*/
2032 /* cdbTypeInfo - print the type information for debugger */
2033 /*-----------------------------------------------------------------*/
2035 cdbTypeInfo (sym_link * type, FILE * of)
2037 fprintf (of, "{%d}", getSize (type));
2042 switch (DCL_TYPE (type))
2045 fprintf (of, "DF,");
2048 fprintf (of, "DG,");
2051 fprintf (of, "DC,");
2054 fprintf (of, "DX,");
2057 fprintf (of, "DD,");
2060 fprintf (of, "DI,");
2063 fprintf (of, "DP,");
2066 fprintf (of, "DA,");
2069 fprintf (of, "DA%d,", DCL_ELEM (type));
2077 switch (SPEC_NOUN (type))
2099 fprintf (of, "ST%s", SPEC_STRUCT (type)->tag);
2107 fprintf (of, "SB%d$%d", SPEC_BSTR (type), SPEC_BLEN (type));
2114 if (SPEC_USIGN (type))
2122 /*-----------------------------------------------------------------*/
2123 /* cdbSymbol - prints a symbol & its type information for debugger */
2124 /*-----------------------------------------------------------------*/
2126 cdbSymbol (symbol * sym, FILE * of, int isStructSym, int isFunc)
2138 fprintf (of, "S:"); /* symbol record */
2139 /* if this is not a structure symbol then
2140 we need to figure out the scope information */
2146 if (IS_STATIC (sym->etype))
2147 fprintf (of, "F%s$", moduleName); /* scope is file */
2149 fprintf (of, "G$"); /* scope is global */
2152 /* symbol is local */
2153 fprintf (of, "L%s$", (sym->localof ? sym->localof->name : "-null-"));
2156 fprintf (of, "S$"); /* scope is structure */
2158 /* print the name, & mangled name */
2159 fprintf (of, "%s$%d$%d(", sym->name,
2160 sym->level, sym->block);
2162 cdbTypeInfo (sym->type, of);
2165 /* print the address space */
2166 map = SPEC_OCLS (sym->etype);
2167 fprintf (of, "%c,%d,%d",
2168 (map ? map->dbName : 'Z'), sym->onStack, SPEC_STAK (sym->etype));
2170 /* if assigned to registers then output register names */
2171 /* if this is a function then print
2172 if is it an interrupt routine & interrupt number
2173 and the register bank it is using */
2175 fprintf (of, ",%d,%d,%d", SPEC_INTRTN (sym->etype),
2176 SPEC_INTN (sym->etype), SPEC_BANK (sym->etype));
2177 /* alternate location to find this symbol @ : eg registers
2184 /*-----------------------------------------------------------------*/
2185 /* cdbStruct - print a structure for debugger */
2186 /*-----------------------------------------------------------------*/
2188 cdbStruct (structdef * sdef, int block, FILE * of,
2189 int inStruct, char *tag)
2194 /* if block # then must have function scope */
2195 fprintf (of, "F%s$", moduleName);
2196 fprintf (of, "%s[", (tag ? tag : sdef->tag));
2197 for (sym = sdef->fields; sym; sym = sym->next)
2199 fprintf (of, "({%d}", sym->offset);
2200 cdbSymbol (sym, of, TRUE, FALSE);
2208 /*------------------------------------------------------------------*/
2209 /* cdbStructBlock - calls struct printing for a blcks */
2210 /*------------------------------------------------------------------*/
2212 cdbStructBlock (int block, FILE * of)
2215 bucket **table = StructTab;
2219 /* go thru the entire table */
2220 for (i = 0; i < 256; i++)
2222 for (chain = table[i]; chain; chain = chain->next)
2224 if (chain->block >= block)
2226 cdbStruct ((structdef *) chain->sym, chain->block, of, 0, NULL);
2232 /*-----------------------------------------------------------------*/
2233 /* powof2 - returns power of two for the number if number is pow 2 */
2234 /*-----------------------------------------------------------------*/
2236 powof2 (unsigned long num)
2249 if (n1s > 1 || nshifts == 0)
2265 /* Dims: mul/div/mod, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
2266 symbol *__muldiv[3][3][2];
2267 /* Dims: BYTE/WORD/DWORD SIGNED/UNSIGNED */
2268 sym_link *__multypes[3][2];
2269 /* Dims: to/from float, BYTE/WORD/DWORD, SIGNED/USIGNED */
2270 symbol *__conv[2][3][2];
2271 /* Dims: shift left/shift right, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
2272 symbol *__rlrr[2][3][2];
2274 sym_link *floatType;
2277 _mangleFunctionName(char *in)
2279 if (port->getMangledFunctionName)
2281 return port->getMangledFunctionName(in);
2289 /*-----------------------------------------------------------------*/
2290 /* initCSupport - create functions for C support routines */
2291 /*-----------------------------------------------------------------*/
2295 const char *smuldivmod[] =
2299 const char *sbwd[] =
2301 "char", "int", "long"
2307 const char *srlrr[] =
2312 int bwd, su, muldivmod, tofrom, rlrr;
2314 floatType = newFloatLink ();
2316 for (bwd = 0; bwd < 3; bwd++)
2333 __multypes[bwd][0] = l;
2334 __multypes[bwd][1] = copyLinkChain (l);
2335 SPEC_USIGN (__multypes[bwd][1]) = 1;
2338 __fsadd = funcOfType ("__fsadd", floatType, floatType, 2, options.float_rent);
2339 __fssub = funcOfType ("__fssub", floatType, floatType, 2, options.float_rent);
2340 __fsmul = funcOfType ("__fsmul", floatType, floatType, 2, options.float_rent);
2341 __fsdiv = funcOfType ("__fsdiv", floatType, floatType, 2, options.float_rent);
2342 __fseq = funcOfType ("__fseq", CHARTYPE, floatType, 2, options.float_rent);
2343 __fsneq = funcOfType ("__fsneq", CHARTYPE, floatType, 2, options.float_rent);
2344 __fslt = funcOfType ("__fslt", CHARTYPE, floatType, 2, options.float_rent);
2345 __fslteq = funcOfType ("__fslteq", CHARTYPE, floatType, 2, options.float_rent);
2346 __fsgt = funcOfType ("__fsgt", CHARTYPE, floatType, 2, options.float_rent);
2347 __fsgteq = funcOfType ("__fsgteq", CHARTYPE, floatType, 2, options.float_rent);
2349 for (tofrom = 0; tofrom < 2; tofrom++)
2351 for (bwd = 0; bwd < 3; bwd++)
2353 for (su = 0; su < 2; su++)
2357 sprintf (buffer, "__fs2%s%s", ssu[su], sbwd[bwd]);
2358 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], floatType, 1, options.float_rent);
2362 sprintf (buffer, "__%s%s2fs", ssu[su], sbwd[bwd]);
2363 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), floatType, __multypes[bwd][su], 1, options.float_rent);
2369 for (muldivmod = 0; muldivmod < 3; muldivmod++)
2371 for (bwd = 0; bwd < 3; bwd++)
2373 for (su = 0; su < 2; su++)
2375 sprintf (buffer, "_%s%s%s",
2376 smuldivmod[muldivmod],
2379 __muldiv[muldivmod][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent);
2380 SPEC_NONBANKED (__muldiv[muldivmod][bwd][su]->etype) = 1;
2385 for (rlrr = 0; rlrr < 2; rlrr++)
2387 for (bwd = 0; bwd < 3; bwd++)
2389 for (su = 0; su < 2; su++)
2391 sprintf (buffer, "_%s%s%s",
2395 __rlrr[rlrr][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[0][0], 2, options.intlong_rent);
2396 SPEC_NONBANKED (__rlrr[rlrr][bwd][su]->etype) = 1;