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 bucket *SymbolTab[256]; /* the symbol table */
28 bucket *StructTab[256]; /* the structure table */
29 bucket *TypedefTab[256]; /* the typedef table */
30 bucket *LabelTab[256]; /* the Label table */
31 bucket *enumTab[256]; /* enumerated table */
33 /*------------------------------------------------------------------*/
34 /* initSymt () - initialises symbol table related stuff */
35 /*------------------------------------------------------------------*/
41 for (i = 0; i < 256; i++)
42 SymbolTab[i] = StructTab[i] = (void *) NULL;
46 /*-----------------------------------------------------------------*/
47 /* newBucket - allocates & returns a new bucket */
48 /*-----------------------------------------------------------------*/
54 bp = Safe_calloc (1, sizeof (bucket));
59 /*-----------------------------------------------------------------*/
60 /* hashKey - computes the hashkey given a symbol name */
61 /*-----------------------------------------------------------------*/
63 hashKey (const char *s)
65 unsigned long key = 0;
72 /*-----------------------------------------------------------------*/
73 /* addSym - adds a symbol to the hash Table */
74 /*-----------------------------------------------------------------*/
76 addSym (bucket ** stab,
82 int i; /* index into the hash Table */
83 bucket *bp; /* temp bucket * */
85 /* the symbols are always added at the head of the list */
87 /* get a free entry */
88 bp = Safe_calloc (1, sizeof (bucket));
90 bp->sym = sym; /* update the symbol pointer */
91 bp->level = level; /* update the nest level */
93 strcpy (bp->name, sname); /* copy the name into place */
95 /* if this is the first entry */
98 bp->prev = bp->next = (void *) NULL; /* point to nothing */
101 /* not first entry then add @ head of list */
111 /*-----------------------------------------------------------------*/
112 /* deleteSym - deletes a symbol from the hash Table entry */
113 /*-----------------------------------------------------------------*/
115 deleteSym (bucket ** stab, void *sym, char *sname)
123 /* find the symbol */
126 if (bp->sym == sym) /* found it then break out */
127 break; /* of the loop */
131 if (!bp) /* did not find it */
133 /* if this is the first one in the chain */
137 if (stab[i]) /* if chain ! empty */
138 stab[i]->prev = (void *) NULL;
140 /* middle || end of chain */
143 if (bp->next) /* if not end of chain */
144 bp->next->prev = bp->prev;
146 bp->prev->next = bp->next;
151 /*-----------------------------------------------------------------*/
152 /* findSym - finds a symbol in a table */
153 /*-----------------------------------------------------------------*/
155 findSym (bucket ** stab, void *sym, const char *sname)
159 bp = stab[hashKey (sname)];
162 if (bp->sym == sym || strcmp (bp->name, sname) == 0)
167 return (bp ? bp->sym : (void *) NULL);
170 /*-----------------------------------------------------------------*/
171 /* findSymWithLevel - finds a symbol with a name & level */
172 /*-----------------------------------------------------------------*/
174 findSymWithLevel (bucket ** stab, symbol * sym)
178 bp = stab[hashKey (sym->name)];
181 ** do the search from the head of the list since the
182 ** elements are added at the head it is ensured that
183 ** we will find the deeper definitions before we find
184 ** the global ones. we need to check for symbols with
185 ** level <= to the level given, if levels match then block
186 ** numbers need to match as well
191 if (strcmp (bp->name, sym->name) == 0 && bp->level <= sym->level)
193 /* if this is parameter then nothing else need to be checked */
194 if (((symbol *) (bp->sym))->_isparm)
196 /* if levels match then block numbers hsould also match */
197 if (bp->level && bp->level == sym->level && bp->block == sym->block)
199 /* if levels don't match then we are okay */
200 if (bp->level && bp->level != sym->level && bp->block <= sym->block)
202 /* if this is a global variable then we are ok too */
210 return (void *) NULL;
213 /*-----------------------------------------------------------------*/
214 /* findSymWithBlock - finds a symbol with name in with a block */
215 /*-----------------------------------------------------------------*/
217 findSymWithBlock (bucket ** stab, symbol * sym, int block)
221 bp = stab[hashKey (sym->name)];
224 if (strcmp (bp->name, sym->name) == 0 &&
230 return (bp ? bp->sym : (void *) NULL);
233 /*------------------------------------------------------------------*/
234 /* newSymbol () - returns a new pointer to a symbol */
235 /*------------------------------------------------------------------*/
237 newSymbol (char *name, int scope)
241 sym = Safe_calloc (1, sizeof (symbol));
243 strcpy (sym->name, name); /* copy the name */
244 sym->level = scope; /* set the level */
245 sym->block = currBlockno;
246 sym->lineDef = yylineno; /* set the line number */
250 /*------------------------------------------------------------------*/
251 /* newLink - creates a new link (declarator,specifier) */
252 /*------------------------------------------------------------------*/
258 p = Safe_calloc (1, sizeof (sym_link));
263 /*------------------------------------------------------------------*/
264 /* newStruct - creats a new structdef from the free list */
265 /*------------------------------------------------------------------*/
267 newStruct (char *tag)
271 s = Safe_calloc (1, sizeof (structdef));
273 strcpy (s->tag, tag); /* copy the tag */
277 /*------------------------------------------------------------------*/
278 /* pointerTypes - do the computation for the pointer types */
279 /*------------------------------------------------------------------*/
281 pointerTypes (sym_link * ptr, sym_link * type)
286 /* find the first pointer type */
287 while (ptr && !IS_PTR (ptr))
290 /* could not find it */
291 if (!ptr || IS_SPEC (ptr) ||
292 DCL_TYPE (ptr) != UPOINTER)
295 /* change the pointer type depending on the
296 storage class of the type */
299 DCL_PTR_CONST (ptr) = SPEC_CONST (type);
300 DCL_PTR_VOLATILE (ptr) = SPEC_VOLATILE (type);
301 switch (SPEC_SCLS (type))
304 DCL_TYPE (ptr) = FPOINTER;
307 DCL_TYPE (ptr) = IPOINTER;
310 DCL_TYPE (ptr) = PPOINTER;
313 DCL_TYPE (ptr) = POINTER;
316 DCL_PTR_CONST (ptr) = port->mem.code_ro;
317 DCL_TYPE (ptr) = CPOINTER;
320 DCL_TYPE (ptr) = EEPPOINTER;
323 DCL_TYPE (ptr) = GPOINTER;
326 /* the storage class of type ends here */
329 SPEC_VOLATILE (type) = 0;
332 /* now change all the remaining unknown pointers
333 to generic pointers */
336 if (!IS_SPEC (ptr) && DCL_TYPE (ptr) == UPOINTER)
337 DCL_TYPE (ptr) = GPOINTER;
341 /* same for the type although it is highly unlikely that
342 type will have a pointer */
345 if (!IS_SPEC (type) && DCL_TYPE (type) == UPOINTER)
346 DCL_TYPE (type) = GPOINTER;
352 /*------------------------------------------------------------------*/
353 /* addDecl - adds a declarator @ the end of a chain */
354 /*------------------------------------------------------------------*/
356 addDecl (symbol * sym, int type, sym_link * p)
362 /* if we are passed a link then set head & tail */
371 head = tail = newLink ();
372 DCL_TYPE (head) = type;
375 /* if this is the first entry */
383 if (IS_SPEC (sym->etype) && IS_SPEC (head) && head == tail)
385 sym->etype = mergeSpec (sym->etype, head);
389 if (IS_SPEC (sym->etype) && !IS_SPEC (head) && head == tail)
392 while (t->next != sym->etype)
395 tail->next = sym->etype;
399 sym->etype->next = head;
405 /* if the type is a unknown pointer and has
406 a tspec then take the storage class const & volatile
407 attribute from the tspec & make it those of this
411 DCL_TYPE (p) == UPOINTER &&
414 if (!IS_SPEC (sym->etype))
416 sym->etype = sym->etype->next = newLink ();
417 sym->etype->class = SPECIFIER;
419 SPEC_SCLS (sym->etype) = SPEC_SCLS (DCL_TSPEC (p));
420 SPEC_CONST (sym->etype) = SPEC_CONST (DCL_TSPEC (p));
421 SPEC_VOLATILE (sym->etype) = SPEC_VOLATILE (DCL_TSPEC (p));
422 DCL_TSPEC (p) = NULL;
427 /*------------------------------------------------------------------*/
428 /* mergeSpec - merges two specifiers and returns the new one */
429 /*------------------------------------------------------------------*/
431 mergeSpec (sym_link * dest, sym_link * src)
433 /* if noun different then src overrides */
434 if (SPEC_NOUN (dest) != SPEC_NOUN (src) && !SPEC_NOUN (dest))
435 SPEC_NOUN (dest) = SPEC_NOUN (src);
437 /* if destination has no storage class */
438 if (!SPEC_SCLS (dest) || (SPEC_SCLS(dest) == S_CONSTANT && SPEC_SCLS (src)))
439 SPEC_SCLS (dest) = SPEC_SCLS (src);
440 /* special case for const */
441 /* copy all the specifications */
442 SPEC_LONG (dest) |= SPEC_LONG (src);
443 SPEC_SHORT (dest) |= SPEC_SHORT (src);
444 SPEC_USIGN (dest) |= SPEC_USIGN (src);
445 SPEC_STAT (dest) |= SPEC_STAT (src);
446 SPEC_EXTR (dest) |= SPEC_EXTR (src);
447 SPEC_ABSA (dest) |= SPEC_ABSA (src);
448 SPEC_RENT (dest) |= SPEC_RENT (src);
449 SPEC_INTN (dest) |= SPEC_INTN (src);
450 SPEC_BANK (dest) |= SPEC_BANK (src);
451 SPEC_VOLATILE (dest) |= SPEC_VOLATILE (src);
452 SPEC_CRTCL (dest) |= SPEC_CRTCL (src);
453 SPEC_ADDR (dest) |= SPEC_ADDR (src);
454 SPEC_OCLS (dest) = SPEC_OCLS (src);
455 SPEC_BLEN (dest) |= SPEC_BLEN (src);
456 SPEC_BSTR (dest) |= SPEC_BSTR (src);
457 SPEC_TYPEDEF (dest) |= SPEC_TYPEDEF (src);
458 SPEC_NONBANKED (dest) |= SPEC_NONBANKED (src);
460 if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL)
461 SPEC_STRUCT (dest) = SPEC_STRUCT (src);
466 /*------------------------------------------------------------------*/
467 /* cloneSpec - copies the entire spec and returns a new spec */
468 /*------------------------------------------------------------------*/
470 cloneSpec (sym_link * src)
474 /* go thru chain till we find the specifier */
475 while (src && src->class != SPECIFIER)
479 memcpy (spec, src, sizeof (sym_link));
483 /*------------------------------------------------------------------*/
484 /* genSymName - generates and returns a name used for anonymous vars */
485 /*------------------------------------------------------------------*/
487 genSymName (int level)
489 static int gCount = 0;
490 static char gname[SDCC_NAME_MAX + 1];
492 sprintf (gname, "__%04d%04d", level, gCount++);
496 /*------------------------------------------------------------------*/
497 /* getSpec - returns the specifier part from a declaration chain */
498 /*------------------------------------------------------------------*/
500 getSpec (sym_link * p)
505 while (p && !(IS_SPEC (p)))
511 /*------------------------------------------------------------------*/
512 /* newCharLink() - creates an int type */
513 /*------------------------------------------------------------------*/
520 p->class = SPECIFIER;
521 SPEC_NOUN (p) = V_CHAR;
526 /*------------------------------------------------------------------*/
527 /* newFloatLink - a new Float type */
528 /*------------------------------------------------------------------*/
535 p->class = SPECIFIER;
536 SPEC_NOUN (p) = V_FLOAT;
541 /*------------------------------------------------------------------*/
542 /* newLongLink() - new long type */
543 /*------------------------------------------------------------------*/
550 p->class = SPECIFIER;
551 SPEC_NOUN (p) = V_INT;
557 /*------------------------------------------------------------------*/
558 /* newIntLink() - creates an int type */
559 /*------------------------------------------------------------------*/
566 p->class = SPECIFIER;
567 SPEC_NOUN (p) = V_INT;
572 /*------------------------------------------------------------------*/
573 /* getSize - returns size of a type chain in bits */
574 /*------------------------------------------------------------------*/
576 getSize (sym_link * p)
578 /* if nothing return 0 */
582 { /* if this is the specifier then */
583 switch (SPEC_NOUN (p))
584 { /* depending on the specifier type */
586 return (IS_LONG (p) ? LONGSIZE : (IS_SHORT (p) ? SHORTSIZE : INTSIZE));
594 return SPEC_STRUCT (p)->size;
600 return ((SPEC_BLEN (p) / 8) + (SPEC_BLEN (p) % 8 ? 1 : 0));
606 /* this is a specifier */
607 switch (DCL_TYPE (p))
612 return DCL_ELEM (p) * getSize (p->next);
629 /*------------------------------------------------------------------*/
630 /* bitsForType - returns # of bits required to store this type */
631 /*------------------------------------------------------------------*/
633 bitsForType (sym_link * p)
635 /* if nothing return 0 */
640 { /* if this is the specifier then */
642 switch (SPEC_NOUN (p))
643 { /* depending on the specifier type */
645 return (IS_LONG (p) ? LONGSIZE * 8 : (IS_SHORT (p) ? SHORTSIZE * 8 : INTSIZE * 8));
647 return FLOATSIZE * 8;
653 return SPEC_STRUCT (p)->size * 8;
659 return SPEC_BLEN (p);
665 /* this is a specifier */
666 switch (DCL_TYPE (p))
671 return DCL_ELEM (p) * getSize (p->next) * 8;
675 return (PTRSIZE * 8);
679 return (FPTRSIZE * 8);
681 return (GPTRSIZE * 8);
688 /*------------------------------------------------------------------*/
689 /* copySymbolChain - copies a symbol chain */
690 /*------------------------------------------------------------------*/
692 copySymbolChain (symbol * src)
699 dest = copySymbol (src);
700 dest->next = copySymbolChain (src->next);
704 /*------------------------------------------------------------------*/
705 /* copySymbol - makes a copy of a symbol */
706 /*------------------------------------------------------------------*/
708 copySymbol (symbol * src)
715 dest = newSymbol (src->name, src->level);
716 memcpy (dest, src, sizeof (symbol));
717 dest->level = src->level;
718 dest->block = src->block;
719 dest->ival = copyIlist (src->ival);
720 dest->type = copyLinkChain (src->type);
721 dest->etype = getSpec (dest->type);
723 dest->args = copyValueChain (src->args);
724 dest->key = src->key;
725 dest->calleeSave = src->calleeSave;
726 dest->allocreq = src->allocreq;
730 /*------------------------------------------------------------------*/
731 /* reverseSyms - reverses the links for a symbol chain */
732 /*------------------------------------------------------------------*/
734 reverseSyms (symbol * sym)
736 symbol *prev, *curr, *next;
751 sym->next = (void *) NULL;
755 /*------------------------------------------------------------------*/
756 /* reverseLink - reverses the links for a type chain */
757 /*------------------------------------------------------------------*/
759 reverseLink (sym_link * type)
761 sym_link *prev, *curr, *next;
776 type->next = (void *) NULL;
780 /*------------------------------------------------------------------*/
781 /* addSymChain - adds a symbol chain to the symboltable */
782 /*------------------------------------------------------------------*/
784 addSymChain (symbol * symHead)
786 symbol *sym = symHead;
789 for (; sym != NULL; sym = sym->next)
792 /* if already exists in the symbol table then check if
793 the previous was an extern definition if yes then
794 then check if the type match, if the types match then
795 delete the current entry and add the new entry */
796 if ((csym = findSymWithLevel (SymbolTab, sym)) &&
797 csym->level == sym->level)
800 /* previous definition extern ? */
801 if (IS_EXTERN (csym->etype))
803 /* do types match ? */
804 if (checkType (csym->type, sym->type) != 1)
806 werror (E_DUPLICATE, csym->name);
808 /* delete current entry */
809 deleteSym (SymbolTab, csym, csym->name);
811 addSym (SymbolTab, sym, sym->name, sym->level, sym->block);
813 else /* not extern */
814 werror (E_DUPLICATE, sym->name);
818 /* check if previously defined */
819 if (csym && csym->level == sym->level)
821 /* if the previous one was declared as extern */
822 /* then check the type with the current one */
823 if (IS_EXTERN (csym->etype))
825 if (checkType (csym->type, sym->type) <= 0)
826 werror (W_EXTERN_MISMATCH, csym->name);
830 addSym (SymbolTab, sym, sym->name, sym->level, sym->block);
835 /*------------------------------------------------------------------*/
836 /* funcInChain - DCL Type 'FUNCTION' found in type chain */
837 /*------------------------------------------------------------------*/
839 funcInChain (sym_link * lnk)
850 /*------------------------------------------------------------------*/
851 /* structElemType - returns the type info of a sturct member */
852 /*------------------------------------------------------------------*/
854 structElemType (sym_link * stype, value * id, value ** argsp)
856 symbol *fields = (SPEC_STRUCT (stype) ? SPEC_STRUCT (stype)->fields : NULL);
857 sym_link *type, *etype;
858 sym_link *petype = getSpec (stype);
863 /* look for the id */
866 if (strcmp (fields->rname, id->name) == 0)
870 *argsp = fields->args;
872 type = copyLinkChain (fields->type);
873 etype = getSpec (type);
874 SPEC_SCLS (etype) = (SPEC_SCLS (petype) == S_REGISTER ?
875 SPEC_SCLS (etype) : SPEC_SCLS (petype));
878 fields = fields->next;
880 werror (E_NOT_MEMBER, id->name);
885 /*------------------------------------------------------------------*/
886 /* getStructElement - returns element of a tructure definition */
887 /*------------------------------------------------------------------*/
889 getStructElement (structdef * sdef, symbol * sym)
893 for (field = sdef->fields; field; field = field->next)
894 if (strcmp (field->name, sym->name) == 0)
897 werror (E_NOT_MEMBER, sym->name);
902 /*------------------------------------------------------------------*/
903 /* compStructSize - computes the size of a structure */
904 /*------------------------------------------------------------------*/
906 compStructSize (int su, structdef * sdef)
908 int sum = 0, usum = 0;
912 /* for the identifiers */
917 /* create the internal name for this variable */
918 sprintf (loop->rname, "_%s", loop->name);
919 loop->offset = (su == UNION ? sum = 0 : sum);
920 SPEC_VOLATILE (loop->etype) |= (su == UNION ? 1 : 0);
922 /* if this is a bit field */
926 /* change it to a unsigned bit */
927 SPEC_NOUN (loop->etype) = V_BIT;
928 SPEC_USIGN (loop->etype) = 1;
929 /* check if this fit into the remaining */
930 /* bits of this byte else align it to the */
931 /* next byte boundary */
932 if ((SPEC_BLEN (loop->etype) = loop->bitVar) <= (8 - bitOffset))
934 SPEC_BSTR (loop->etype) = bitOffset;
935 if ((bitOffset += (loop->bitVar % 8)) == 8)
942 SPEC_BSTR (loop->etype) = bitOffset;
943 sum += (loop->bitVar / 8);
944 bitOffset += (loop->bitVar % 8);
946 /* if this is the last field then pad */
947 if (!loop->next && bitOffset && bitOffset != 8)
956 sum += getSize (loop->type);
959 /* if function then do the arguments for it */
960 if (funcInChain (loop->type))
962 processFuncArgs (loop, 1);
967 /* if this is not a bitfield but the */
968 /* previous one was and did not take */
969 /* the whole byte then pad the rest */
970 if ((loop && !loop->bitVar) && bitOffset)
976 /* if union then size = sizeof larget field */
978 usum = max (usum, sum);
982 return (su == UNION ? usum : sum);
985 /*------------------------------------------------------------------*/
986 /* checkSClass - check the storage class specification */
987 /*------------------------------------------------------------------*/
989 checkSClass (symbol * sym)
991 /* type is literal can happen foe enums change
993 if (SPEC_SCLS (sym->etype) == S_LITERAL && !SPEC_ENUM (sym->etype))
994 SPEC_SCLS (sym->etype) = S_AUTO;
996 /* if sfr or sbit then must also be */
997 /* volatile the initial value will be xlated */
998 /* to an absolute address */
999 if (SPEC_SCLS (sym->etype) == S_SBIT ||
1000 SPEC_SCLS (sym->etype) == S_SFR)
1002 SPEC_VOLATILE (sym->etype) = 1;
1003 /* if initial value given */
1006 SPEC_ABSA (sym->etype) = 1;
1007 SPEC_ADDR (sym->etype) =
1008 (int) list2int (sym->ival);
1013 /* if absolute address given then it mark it as
1015 if (IS_ABSOLUTE (sym->etype))
1016 SPEC_VOLATILE (sym->etype) = 1;
1018 /* global variables declared const put into code */
1019 if (sym->level == 0 &&
1020 SPEC_SCLS (sym->etype) == S_CONSTANT)
1022 SPEC_SCLS (sym->etype) = S_CODE;
1023 SPEC_CONST (sym->etype) = 1;
1026 /* global variable in code space is a constant */
1027 if (sym->level == 0 &&
1028 SPEC_SCLS (sym->etype) == S_CODE &&
1030 SPEC_CONST (sym->etype) = 1;
1033 /* if bit variable then no storage class can be */
1034 /* specified since bit is already a storage */
1035 if (IS_BITVAR (sym->etype) &&
1036 (SPEC_SCLS (sym->etype) != S_FIXED &&
1037 SPEC_SCLS (sym->etype) != S_SBIT &&
1038 SPEC_SCLS (sym->etype) != S_BIT)
1041 werror (E_BITVAR_STORAGE, sym->name);
1042 SPEC_SCLS (sym->etype) = S_FIXED;
1045 /* extern variables cannot be initialized */
1046 if (IS_EXTERN (sym->etype) && sym->ival)
1048 werror (E_EXTERN_INIT, sym->name);
1052 /* if this is an automatic symbol then */
1053 /* storage class will be ignored and */
1054 /* symbol will be allocated on stack/ */
1055 /* data depending on flag */
1057 (options.stackAuto || reentrant) &&
1058 (SPEC_SCLS (sym->etype) != S_AUTO &&
1059 SPEC_SCLS (sym->etype) != S_FIXED &&
1060 SPEC_SCLS (sym->etype) != S_REGISTER &&
1061 SPEC_SCLS (sym->etype) != S_STACK &&
1062 SPEC_SCLS (sym->etype) != S_XSTACK &&
1063 SPEC_SCLS (sym->etype) != S_CONSTANT))
1066 werror (E_AUTO_ASSUMED, sym->name);
1067 SPEC_SCLS (sym->etype) = S_AUTO;
1070 /* automatic symbols cannot be given */
1071 /* an absolute address ignore it */
1073 SPEC_ABSA (sym->etype) &&
1074 (options.stackAuto || reentrant))
1076 werror (E_AUTO_ABSA, sym->name);
1077 SPEC_ABSA (sym->etype) = 0;
1080 /* arrays & pointers cannot be defined for bits */
1081 /* SBITS or SFRs or BIT */
1082 if ((IS_ARRAY (sym->type) || IS_PTR (sym->type)) &&
1083 (SPEC_NOUN (sym->etype) == V_BIT ||
1084 SPEC_NOUN (sym->etype) == V_SBIT ||
1085 SPEC_SCLS (sym->etype) == S_SFR))
1086 werror (E_BIT_ARRAY, sym->name);
1088 /* if this is a bit|sbit then set length & start */
1089 if (SPEC_NOUN (sym->etype) == V_BIT ||
1090 SPEC_NOUN (sym->etype) == V_SBIT)
1092 SPEC_BLEN (sym->etype) = 1;
1093 SPEC_BSTR (sym->etype) = 0;
1096 /* variables declared in CODE space must have */
1097 /* initializers if not an extern */
1098 if (SPEC_SCLS (sym->etype) == S_CODE &&
1099 sym->ival == NULL &&
1101 port->mem.code_ro &&
1102 !IS_EXTERN (sym->etype) &&
1103 !funcInChain (sym->type))
1104 werror (E_CODE_NO_INIT, sym->name);
1106 /* if parameter or local variable then change */
1107 /* the storage class to reflect where the var will go */
1108 if (sym->level && SPEC_SCLS (sym->etype) == S_FIXED)
1110 if (options.stackAuto || (currFunc && IS_RENT (currFunc->etype)))
1112 SPEC_SCLS (sym->etype) = (options.useXstack ?
1113 S_XSTACK : S_STACK);
1117 /* hack-o-matic! I see no reason why the useXstack option should ever
1118 * control this allcoation, but the code was originally that way, and
1119 * changing it for non-390 ports breaks the compiler badly.
1121 bool useXdata = IS_DS390_PORT ? options.model : options.useXstack;
1122 SPEC_SCLS (sym->etype) = (useXdata ?
1128 /*------------------------------------------------------------------*/
1129 /* changePointer - change pointer to functions */
1130 /*------------------------------------------------------------------*/
1132 changePointer (symbol * sym)
1136 /* go thru the chain of declarations */
1137 /* if we find a pointer to a function */
1138 /* unconditionally change it to a ptr */
1140 for (p = sym->type; p; p = p->next)
1142 if (!IS_SPEC (p) && DCL_TYPE (p) == UPOINTER)
1143 DCL_TYPE (p) = GPOINTER;
1144 if (IS_PTR (p) && IS_FUNC (p->next))
1145 DCL_TYPE (p) = CPOINTER;
1149 /*------------------------------------------------------------------*/
1150 /* checkDecl - does semantic validation of a declaration */
1151 /*------------------------------------------------------------------*/
1153 checkDecl (symbol * sym)
1156 checkSClass (sym); /* check the storage class */
1157 changePointer (sym); /* change pointers if required */
1159 /* if this is an array without any dimension
1160 then update the dimension from the initial value */
1161 if (IS_ARRAY (sym->type) && !DCL_ELEM (sym->type))
1162 DCL_ELEM (sym->type) = getNelements (sym->type, sym->ival);
1167 /*------------------------------------------------------------------*/
1168 /* copyLinkChain - makes a copy of the link chain & rets ptr 2 head */
1169 /*------------------------------------------------------------------*/
1171 copyLinkChain (sym_link * p)
1173 sym_link *head, *curr, *loop;
1176 head = loop = (curr ? newLink () : (void *) NULL);
1179 memcpy (loop, curr, sizeof (sym_link)); /* copy it */
1180 loop->next = (curr->next ? newLink () : (void *) NULL);
1189 /*------------------------------------------------------------------*/
1190 /* cleanUpBlock - cleansup the symbol table specified for all the */
1191 /* symbols in the given block */
1192 /*------------------------------------------------------------------*/
1194 cleanUpBlock (bucket ** table, int block)
1199 /* go thru the entire table */
1200 for (i = 0; i < 256; i++)
1202 for (chain = table[i]; chain; chain = chain->next)
1204 if (chain->block >= block)
1206 deleteSym (table, chain->sym, chain->name);
1212 /*------------------------------------------------------------------*/
1213 /* cleanUpLevel - cleansup the symbol table specified for all the */
1214 /* symbols in the given level */
1215 /*------------------------------------------------------------------*/
1217 cleanUpLevel (bucket ** table, int level)
1222 /* go thru the entire table */
1223 for (i = 0; i < 256; i++)
1225 for (chain = table[i]; chain; chain = chain->next)
1227 if (chain->level >= level)
1229 deleteSym (table, chain->sym, chain->name);
1235 /*------------------------------------------------------------------*/
1236 /* computeType - computes the resultant type from two types */
1237 /*------------------------------------------------------------------*/
1239 computeType (sym_link * type1, sym_link * type2)
1243 sym_link *etype1 = getSpec (type1);
1244 sym_link *etype2 = getSpec (type2);
1246 /* if one of them is a float then result is a float */
1247 /* here we assume that the types passed are okay */
1248 /* and can be cast to one another */
1249 /* which ever is greater in size */
1250 if (IS_FLOAT (etype1) || IS_FLOAT (etype2))
1251 rType = newFloatLink ();
1253 /* if only one of them is a bit variable
1254 then the other one prevails */
1255 if (IS_BITVAR (etype1) && !IS_BITVAR (etype2))
1256 rType = copyLinkChain (type2);
1257 else if (IS_BITVAR (etype2) && !IS_BITVAR (etype1))
1258 rType = copyLinkChain (type1);
1260 /* if one of them is a pointer then that
1263 rType = copyLinkChain (type1);
1264 else if (IS_PTR (type2))
1265 rType = copyLinkChain (type2);
1266 else if (getSize (type1) > getSize (type2))
1267 rType = copyLinkChain (type1);
1269 rType = copyLinkChain (type2);
1271 reType = getSpec (rType);
1273 /* if either of them unsigned then make this unsigned */
1274 if ((SPEC_USIGN (etype1) || SPEC_USIGN (etype2)) && !IS_FLOAT (reType))
1275 SPEC_USIGN (reType) = 1;
1277 /* if result is a literal then make not so */
1278 if (IS_LITERAL (reType))
1279 SPEC_SCLS (reType) = S_REGISTER;
1284 /*------------------------------------------------------------------*/
1285 /* checkType - will do type check return 1 if match */
1286 /*------------------------------------------------------------------*/
1288 checkType (sym_link * dest, sym_link * src)
1299 /* if dest is a declarator then */
1304 if (DCL_TYPE (src) == DCL_TYPE (dest))
1305 return checkType (dest->next, src->next);
1306 else if (IS_PTR (src) && IS_PTR (dest))
1308 else if (IS_PTR (dest) && IS_ARRAY (src))
1310 else if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
1311 return -1 * checkType (dest->next, src);
1315 else if (IS_PTR (dest) && IS_INTEGRAL (src))
1321 /* if one is a specifier and the other is not */
1322 if ((IS_SPEC (src) && !IS_SPEC (dest)) ||
1323 (IS_SPEC (dest) && !IS_SPEC (src)))
1326 /* if one of them is a void then ok */
1327 if (SPEC_NOUN (dest) == V_VOID &&
1328 SPEC_NOUN (src) != V_VOID)
1331 if (SPEC_NOUN (dest) != V_VOID &&
1332 SPEC_NOUN (src) == V_VOID)
1335 /* char === to short */
1336 if (SPEC_NOUN (dest) == V_CHAR &&
1337 SPEC_NOUN (src) == V_INT &&
1339 return (SPEC_USIGN (src) == SPEC_USIGN (dest) ? 1 : -2);
1341 if (SPEC_NOUN (src) == V_CHAR &&
1342 SPEC_NOUN (dest) == V_INT &&
1344 return (SPEC_USIGN (src) == SPEC_USIGN (dest) ? 1 : -2);
1346 /* if they are both bitfields then if the lengths
1347 and starts don't match */
1348 if (IS_BITFIELD (dest) && IS_BITFIELD (src) &&
1349 (SPEC_BLEN (dest) != SPEC_BLEN (src) ||
1350 SPEC_BSTR (dest) != SPEC_BSTR (src)))
1353 /* it is a specifier */
1354 if (SPEC_NOUN (dest) != SPEC_NOUN (src))
1356 if (SPEC_USIGN (dest) == SPEC_USIGN (src) &&
1357 IS_INTEGRAL (dest) && IS_INTEGRAL (src) &&
1358 getSize (dest) == getSize (src))
1360 else if (IS_ARITHMETIC (dest) && IS_ARITHMETIC (src))
1365 else if (IS_STRUCT (dest))
1367 if (SPEC_STRUCT (dest) != SPEC_STRUCT (src))
1372 if (SPEC_LONG (dest) != SPEC_LONG (src))
1375 if (SPEC_SHORT (dest) != SPEC_SHORT (src))
1378 if (SPEC_USIGN (dest) != SPEC_USIGN (src))
1384 /*------------------------------------------------------------------*/
1385 /* inCalleeSaveList - return 1 if found in calle save list */
1386 /*------------------------------------------------------------------*/
1388 inCalleeSaveList (char *s)
1392 for (i = 0; options.calleeSaves[i]; i++)
1393 if (strcmp (options.calleeSaves[i], s) == 0)
1399 /*-----------------------------------------------------------------*/
1400 /* aggregateArgToPointer: change an agggregate type function */
1401 /* argument to a pointer to that type. */
1402 /*-----------------------------------------------------------------*/
1404 aggregateArgToPointer (value * val)
1406 if (IS_AGGREGATE (val->type))
1408 /* if this is a structure */
1409 /* then we need to add a new link */
1410 if (IS_STRUCT (val->type))
1412 /* first lets add DECLARATOR type */
1413 sym_link *p = val->type;
1415 werror (W_STRUCT_AS_ARG, val->name);
1416 val->type = newLink ();
1417 val->type->next = p;
1420 /* change to a pointer depending on the */
1421 /* storage class specified */
1422 switch (SPEC_SCLS (val->etype))
1425 DCL_TYPE (val->type) = IPOINTER;
1428 DCL_TYPE (val->type) = PPOINTER;
1433 /* The AUTO and REGISTER classes should probably
1434 * also become generic pointers, but I haven't yet
1435 * devised a test case for that.
1437 DCL_TYPE (val->type) = GPOINTER;
1444 DCL_TYPE (val->type) = POINTER;
1447 DCL_TYPE (val->type) = CPOINTER;
1450 DCL_TYPE (val->type) = FPOINTER;
1453 DCL_TYPE (val->type) = EEPPOINTER;
1456 DCL_TYPE (val->type) = GPOINTER;
1459 /* is there is a symbol associated then */
1460 /* change the type of the symbol as well */
1463 val->sym->type = copyLinkChain (val->type);
1464 val->sym->etype = getSpec (val->sym->type);
1468 /*------------------------------------------------------------------*/
1469 /* checkFunction - does all kinds of check on a function */
1470 /*------------------------------------------------------------------*/
1472 checkFunction (symbol * sym)
1475 value *exargs, *acargs;
1478 /* if not type then some kind of error */
1482 /* if the function has no type then make it return int */
1483 if (!sym->type->next)
1484 sym->type->next = sym->etype = newIntLink ();
1486 /* function cannot return aggregate */
1487 if (IS_AGGREGATE (sym->type->next))
1489 werror (E_FUNC_AGGR, sym->name);
1493 /* function cannot return bit */
1494 if (IS_BITVAR (sym->type->next))
1496 werror (E_FUNC_BIT, sym->name);
1500 /* check if this function is defined as calleeSaves
1501 then mark it as such */
1502 sym->calleeSave = inCalleeSaveList (sym->name);
1504 /* if interrupt service routine */
1505 /* then it cannot have arguments */
1506 if (sym->args && IS_ISR (sym->etype) && !IS_VOID (sym->args->type))
1508 werror (E_INT_ARGS, sym->name);
1512 if (!(csym = findSym (SymbolTab, sym, sym->name)))
1513 return 1; /* not defined nothing more to check */
1515 /* check if body already present */
1516 if (csym && csym->fbody)
1518 werror (E_FUNC_BODY, sym->name);
1522 /* check the return value type */
1523 if (checkType (csym->type, sym->type) <= 0)
1525 werror (E_PREV_DEF_CONFLICT, csym->name, "type");
1526 werror (E_CONTINUE, "previous defintion type ");
1527 printTypeChain (csym->type, stderr);
1528 fprintf (stderr, "\n");
1529 werror (E_CONTINUE, "current definition type ");
1530 printTypeChain (sym->type, stderr);
1531 fprintf (stderr, "\n");
1535 if (SPEC_INTRTN (csym->etype) != SPEC_INTRTN (sym->etype))
1537 werror (E_PREV_DEF_CONFLICT, csym->name, "interrupt");
1541 if (SPEC_BANK (csym->etype) != SPEC_BANK (sym->etype))
1543 werror (E_PREV_DEF_CONFLICT, csym->name, "using");
1547 /* compare expected agrs with actual args */
1548 exargs = csym->args;
1551 /* for all the expected args do */
1554 exargs = exargs->next, acargs = acargs->next, argCnt++)
1557 /* If the actual argument is an array, any prototype
1558 * will have modified it to a pointer. Duplicate that
1561 if (IS_AGGREGATE (acargs->type))
1563 checkValue = copyValue (acargs);
1564 aggregateArgToPointer (checkValue);
1568 checkValue = acargs;
1571 if (checkType (exargs->type, checkValue->type) <= 0)
1573 werror (E_ARG_TYPE, argCnt);
1578 /* if one them ended we have a problem */
1579 if ((exargs && !acargs && !IS_VOID (exargs->type)) ||
1580 (!exargs && acargs && !IS_VOID (acargs->type)))
1581 werror (E_ARG_COUNT);
1583 /* replace with this defition */
1584 sym->cdef = csym->cdef;
1585 deleteSym (SymbolTab, csym, csym->name);
1586 addSym (SymbolTab, sym, sym->name, sym->level, sym->block);
1587 if (IS_EXTERN (csym->etype) && !
1588 IS_EXTERN (sym->etype))
1590 addSet (&publics, sym);
1595 /*-----------------------------------------------------------------*/
1596 /* processFuncArgs - does some processing with function args */
1597 /*-----------------------------------------------------------------*/
1599 processFuncArgs (symbol * func, int ignoreName)
1605 /* if this function has variable argument list */
1606 /* then make the function a reentrant one */
1608 SPEC_RENT (func->etype) = 1;
1610 /* check if this function is defined as calleeSaves
1611 then mark it as such */
1612 func->calleeSave = inCalleeSaveList (func->name);
1614 val = func->args; /* loop thru all the arguments */
1616 /* if it is void then remove parameters */
1617 if (val && IS_VOID (val->type))
1623 /* reset regparm for the port */
1624 (*port->reset_regparms) ();
1625 /* if any of the arguments is an aggregate */
1626 /* change it to pointer to the same type */
1629 /* mark it as a register parameter if
1630 the function does not have VA_ARG
1631 and as port dictates
1632 not inhibited by command line option or #pragma */
1633 if (!func->hasVargs &&
1634 !options.noregparms &&
1635 !IS_RENT (func->etype) &&
1636 (*port->reg_parm) (val->type))
1638 SPEC_REGPARM (val->etype) = 1;
1641 if (IS_AGGREGATE (val->type))
1643 aggregateArgToPointer (val);
1649 /* if this function is reentrant or */
1650 /* automatics r 2b stacked then nothing */
1651 if (IS_RENT (func->etype) || options.stackAuto)
1659 /* if a symbolname is not given */
1660 /* synthesize a variable name */
1664 sprintf (val->name, "_%s_PARM_%d", func->name, pNum++);
1665 val->sym = newSymbol (val->name, 1);
1666 SPEC_OCLS (val->etype) = port->mem.default_local_map;
1667 val->sym->type = copyLinkChain (val->type);
1668 val->sym->etype = getSpec (val->sym->type);
1669 val->sym->_isparm = 1;
1670 strcpy (val->sym->rname, val->name);
1671 SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
1672 SPEC_STAT (func->etype);
1673 addSymChain (val->sym);
1676 else /* symbol name given create synth name */
1679 sprintf (val->name, "_%s_PARM_%d", func->name, pNum++);
1680 strcpy (val->sym->rname, val->name);
1681 val->sym->_isparm = 1;
1682 SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) =
1683 (options.model != MODEL_SMALL ? xdata : data);
1684 SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
1685 SPEC_STAT (func->etype);
1691 /*-----------------------------------------------------------------*/
1692 /* isSymbolEqual - compares two symbols return 1 if they match */
1693 /*-----------------------------------------------------------------*/
1695 isSymbolEqual (symbol * dest, symbol * src)
1697 /* if pointers match then equal */
1701 /* if one of them is null then don't match */
1705 /* if both of them have rname match on rname */
1706 if (dest->rname[0] && src->rname[0])
1707 return (!strcmp (dest->rname, src->rname));
1709 /* otherwise match on name */
1710 return (!strcmp (dest->name, src->name));
1713 void PT(sym_link *type)
1715 printTypeChain(type,0);
1717 /*-----------------------------------------------------------------*/
1718 /* printTypeChain - prints the type chain in human readable form */
1719 /*-----------------------------------------------------------------*/
1721 printTypeChain (sym_link * type, FILE * of)
1735 switch (DCL_TYPE (type))
1738 fprintf (of, "function ");
1741 fprintf (of, "_generic * ");
1742 if (DCL_PTR_CONST (type))
1743 fprintf (of, "const ");
1746 fprintf (of, "_code * ");
1747 if (DCL_PTR_CONST (type))
1748 fprintf (of, "const ");
1751 fprintf (of, "_far * ");
1752 if (DCL_PTR_CONST (type))
1753 fprintf (of, "const ");
1756 fprintf (of, "_eeprom * ");
1757 if (DCL_PTR_CONST (type))
1758 fprintf (of, "const ");
1762 fprintf (of, "_near * ");
1763 if (DCL_PTR_CONST (type))
1764 fprintf (of, "const ");
1767 fprintf (of, "_idata *");
1768 if (DCL_PTR_CONST (type))
1769 fprintf (of, "const ");
1772 fprintf (of, "_pdata *");
1773 if (DCL_PTR_CONST (type))
1774 fprintf (of, "const ");
1777 fprintf (of, " _unkown *");
1778 if (DCL_PTR_CONST (type))
1779 fprintf (of, "const ");
1783 fprintf (of, "array of ");
1789 if (SPEC_VOLATILE (type))
1790 fprintf (of, "volatile ");
1791 if (SPEC_USIGN (type))
1792 fprintf (of, "unsigned ");
1793 if (SPEC_CONST (type))
1794 fprintf (of, "const ");
1796 switch (SPEC_NOUN (type))
1800 fprintf (of, "long ");
1801 else if (IS_SHORT (type))
1802 fprintf (of, "short ");
1804 fprintf (of, "int ");
1808 fprintf (of, "char ");
1812 fprintf (of, "void ");
1816 fprintf (of, "float ");
1820 fprintf (of, "struct %s", SPEC_STRUCT (type)->tag);
1824 fprintf (of, "sbit ");
1828 fprintf (of, "bit {%d,%d}", SPEC_BSTR (type), SPEC_BLEN (type));
1841 /*-----------------------------------------------------------------*/
1842 /* cdbTypeInfo - print the type information for debugger */
1843 /*-----------------------------------------------------------------*/
1845 cdbTypeInfo (sym_link * type, FILE * of)
1847 fprintf (of, "{%d}", getSize (type));
1852 switch (DCL_TYPE (type))
1855 fprintf (of, "DF,");
1858 fprintf (of, "DG,");
1861 fprintf (of, "DC,");
1864 fprintf (of, "DX,");
1867 fprintf (of, "DD,");
1870 fprintf (of, "DI,");
1873 fprintf (of, "DP,");
1876 fprintf (of, "DA,");
1879 fprintf (of, "DA%d,", DCL_ELEM (type));
1887 switch (SPEC_NOUN (type))
1892 else if (IS_SHORT (type))
1911 fprintf (of, "ST%s", SPEC_STRUCT (type)->tag);
1919 fprintf (of, "SB%d$%d", SPEC_BSTR (type), SPEC_BLEN (type));
1926 if (SPEC_USIGN (type))
1934 /*-----------------------------------------------------------------*/
1935 /* cdbSymbol - prints a symbol & its type information for debugger */
1936 /*-----------------------------------------------------------------*/
1938 cdbSymbol (symbol * sym, FILE * of, int isStructSym, int isFunc)
1950 fprintf (of, "S:"); /* symbol record */
1951 /* if this is not a structure symbol then
1952 we need to figure out the scope information */
1958 if (IS_STATIC (sym->etype))
1959 fprintf (of, "F%s$", moduleName); /* scope is file */
1961 fprintf (of, "G$"); /* scope is global */
1964 /* symbol is local */
1965 fprintf (of, "L%s$", (sym->localof ? sym->localof->name : "-null-"));
1968 fprintf (of, "S$"); /* scope is structure */
1970 /* print the name, & mangled name */
1971 fprintf (of, "%s$%d$%d(", sym->name,
1972 sym->level, sym->block);
1974 cdbTypeInfo (sym->type, of);
1977 /* print the address space */
1978 map = SPEC_OCLS (sym->etype);
1979 fprintf (of, "%c,%d,%d",
1980 (map ? map->dbName : 'Z'), sym->onStack, SPEC_STAK (sym->etype));
1982 /* if assigned to registers then output register names */
1983 /* if this is a function then print
1984 if is it an interrupt routine & interrupt number
1985 and the register bank it is using */
1987 fprintf (of, ",%d,%d,%d", SPEC_INTRTN (sym->etype),
1988 SPEC_INTN (sym->etype), SPEC_BANK (sym->etype));
1989 /* alternate location to find this symbol @ : eg registers
1996 /*-----------------------------------------------------------------*/
1997 /* cdbStruct - print a structure for debugger */
1998 /*-----------------------------------------------------------------*/
2000 cdbStruct (structdef * sdef, int block, FILE * of,
2001 int inStruct, char *tag)
2006 /* if block # then must have function scope */
2007 fprintf (of, "F%s$", moduleName);
2008 fprintf (of, "%s[", (tag ? tag : sdef->tag));
2009 for (sym = sdef->fields; sym; sym = sym->next)
2011 fprintf (of, "({%d}", sym->offset);
2012 cdbSymbol (sym, of, TRUE, FALSE);
2020 /*------------------------------------------------------------------*/
2021 /* cdbStructBlock - calls struct printing for a blcks */
2022 /*------------------------------------------------------------------*/
2024 cdbStructBlock (int block, FILE * of)
2027 bucket **table = StructTab;
2031 /* go thru the entire table */
2032 for (i = 0; i < 256; i++)
2034 for (chain = table[i]; chain; chain = chain->next)
2036 if (chain->block >= block)
2038 cdbStruct ((structdef *) chain->sym, chain->block, of, 0, NULL);
2044 /*-----------------------------------------------------------------*/
2045 /* powof2 - returns power of two for the number if number is pow 2 */
2046 /*-----------------------------------------------------------------*/
2048 powof2 (unsigned long num)
2061 if (n1s > 1 || nshifts == 0)
2077 /* Dims: mul/div/mod, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
2078 symbol *__muldiv[3][3][2];
2079 /* Dims: BYTE/WORD/DWORD SIGNED/UNSIGNED */
2080 sym_link *__multypes[3][2];
2081 /* Dims: to/from float, BYTE/WORD/DWORD, SIGNED/USIGNED */
2082 symbol *__conv[2][3][2];
2084 sym_link *floatType;
2087 _makeRegParam (symbol * sym)
2091 val = sym->args; /* loop thru all the arguments */
2093 /* reset regparm for the port */
2094 (*port->reset_regparms) ();
2097 SPEC_REGPARM (val->etype) = 1;
2098 sym->argStack -= getSize (val->type);
2103 /*-----------------------------------------------------------------*/
2104 /* initCSupport - create functions for C support routines */
2105 /*-----------------------------------------------------------------*/
2109 const char *smuldivmod[] =
2113 const char *sbwd[] =
2115 "char", "int", "long"
2122 int bwd, su, muldivmod, tofrom;
2124 floatType = newFloatLink ();
2126 for (bwd = 0; bwd < 3; bwd++)
2143 __multypes[bwd][0] = l;
2144 __multypes[bwd][1] = copyLinkChain (l);
2145 SPEC_USIGN (__multypes[bwd][1]) = 1;
2148 __fsadd = funcOfType ("__fsadd", floatType, floatType, 2, options.float_rent);
2149 __fssub = funcOfType ("__fssub", floatType, floatType, 2, options.float_rent);
2150 __fsmul = funcOfType ("__fsmul", floatType, floatType, 2, options.float_rent);
2151 __fsdiv = funcOfType ("__fsdiv", floatType, floatType, 2, options.float_rent);
2152 __fseq = funcOfType ("__fseq", CHARTYPE, floatType, 2, options.float_rent);
2153 __fsneq = funcOfType ("__fsneq", CHARTYPE, floatType, 2, options.float_rent);
2154 __fslt = funcOfType ("__fslt", CHARTYPE, floatType, 2, options.float_rent);
2155 __fslteq = funcOfType ("__fslteq", CHARTYPE, floatType, 2, options.float_rent);
2156 __fsgt = funcOfType ("__fsgt", CHARTYPE, floatType, 2, options.float_rent);
2157 __fsgteq = funcOfType ("__fsgteq", CHARTYPE, floatType, 2, options.float_rent);
2159 for (tofrom = 0; tofrom < 2; tofrom++)
2161 for (bwd = 0; bwd < 3; bwd++)
2163 for (su = 0; su < 2; su++)
2167 sprintf (buffer, "__fs2%s%s", ssu[su], sbwd[bwd]);
2168 __conv[tofrom][bwd][su] = funcOfType (buffer, __multypes[bwd][su], floatType, 1, options.float_rent);
2172 sprintf (buffer, "__%s%s2fs", ssu[su], sbwd[bwd]);
2173 __conv[tofrom][bwd][su] = funcOfType (buffer, floatType, __multypes[bwd][su], 1, options.float_rent);
2179 for (muldivmod = 0; muldivmod < 3; muldivmod++)
2181 for (bwd = 0; bwd < 3; bwd++)
2183 for (su = 0; su < 2; su++)
2185 sprintf (buffer, "_%s%s%s",
2186 smuldivmod[muldivmod],
2189 __muldiv[muldivmod][bwd][su] = funcOfType (buffer, __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent);
2190 SPEC_NONBANKED (__muldiv[muldivmod][bwd][su]->etype) = 1;
2191 if (bwd < port->muldiv.force_reg_param_below)
2192 _makeRegParam (__muldiv[muldivmod][bwd][su]);