size of a function is the size of a code pointer
[fw/sdcc] / src / SDCCsymt.c
index 433afeafc7ffa0b9cc7147f80f2982896016d46d..8074d2224fde75eb0120f2915b3db3ebc3e7ff98 100644 (file)
 #include "common.h"
 #include "newalloc.h"
 
+value *aggregateToPointer (value *val);
+
+void printFromToType(sym_link *from, sym_link *to) {
+  fprintf (stderr, "from type '");
+  printTypeChain (from, stderr);
+  fprintf (stderr, "'\nto type '");
+  printTypeChain (to, stderr);
+  fprintf (stderr, "'\n");
+}
+
 /* noun strings */
 char *nounName(sym_link *sl) {
   switch (SPEC_NOUN(sl)) 
@@ -72,7 +82,7 @@ newBucket ()
 {
   bucket *bp;
 
-  bp = Safe_calloc (1, sizeof (bucket));
+  bp = Safe_alloc ( sizeof (bucket));
 
   return bp;
 }
@@ -105,17 +115,25 @@ addSym (bucket ** stab,
   bucket *bp;                  /* temp bucket    *         */
 
   if (checkType) {
+    symbol *csym = (symbol *)sym;
+
     if (getenv("DEBUG_SANITY")) {
       fprintf (stderr, "addSym: %s ", sname);
     }
     /* make sure the type is complete and sane */
-    checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
+    checkTypeSanity(csym->etype, csym->name);
+  }
+
+  /* prevent overflow of the (r)name buffers */
+  if (strlen(sname)>SDCC_SYMNAME_MAX) {
+    werror (W_SYMBOL_NAME_TOO_LONG, SDCC_SYMNAME_MAX);
+    sname[SDCC_SYMNAME_MAX]='\0';
   }
 
   /* the symbols are always added at the head of the list  */
   i = hashKey (sname);
   /* get a free entry */
-  bp = Safe_calloc (1, sizeof (bucket));
+  bp = Safe_alloc ( sizeof (bucket));
 
   bp->sym = sym;               /* update the symbol pointer  */
   bp->level = level;           /* update the nest level      */
@@ -267,7 +285,7 @@ newSymbol (char *name, int scope)
 {
   symbol *sym;
 
-  sym = Safe_calloc (1, sizeof (symbol));
+  sym = Safe_alloc ( sizeof (symbol));
 
   strcpy (sym->name, name);    /* copy the name    */
   sym->level = scope;          /* set the level    */
@@ -284,7 +302,7 @@ newLink ()
 {
   sym_link *p;
 
-  p = Safe_calloc (1, sizeof (sym_link));
+  p = Safe_alloc ( sizeof (sym_link));
 
   return p;
 }
@@ -297,7 +315,7 @@ newStruct (char *tag)
 {
   structdef *s;
 
-  s = Safe_calloc (1, sizeof (structdef));
+  s = Safe_alloc ( sizeof (structdef));
 
   strcpy (s->tag, tag);                /* copy the tag            */
   return s;
@@ -392,6 +410,9 @@ addDecl (symbol * sym, int type, sym_link * p)
   sym_link *tail;
   sym_link *t;
 
+  if (getenv("SDCC_DEBUG_FUNCTION_POINTERS"))
+    fprintf (stderr, "SDCCsymt.c:addDecl(%s,%d,%p)\n", sym->name, type, p);
+
   /* if we are passed a link then set head & tail */
   if (p)
     {
@@ -454,6 +475,12 @@ addDecl (symbol * sym, int type, sym_link * p)
       SPEC_VOLATILE (sym->etype) = SPEC_VOLATILE (DCL_TSPEC (p));
       DCL_TSPEC (p) = NULL;
     }
+
+  // if there is a function in this type chain
+  if (p && funcInChain(sym->type)) {
+    processFuncArgs (sym);
+  }
+
   return;
 }
 
@@ -530,36 +557,17 @@ void checkTypeSanity(sym_link *etype, char *name) {
 sym_link *
 mergeSpec (sym_link * dest, sym_link * src, char *name)
 {
-
   sym_link *symlink=dest;
 
-#if 0
-  if (!IS_SPEC(dest)) {
-    // This can happen for pointers, find the end type
-    while (dest && !IS_SPEC(dest))
-      dest=dest->next;
-  }
-  if (!IS_SPEC(src)) {
-    // here we have a declarator as source, reverse them
-    symlink=src;
-    src=dest;
-    dest=symlink;
-    while (dest && !IS_SPEC(dest)) {
-      // and find the specifier
-      dest=dest->next;
-    }
-  } else {
-    symlink=dest;
-  }
-#endif
-
   if (!IS_SPEC(dest) || !IS_SPEC(src)) {
+#if 0
     werror (E_INTERNAL_ERROR, __FILE__, __LINE__, "cannot merge declarator");
     exit (1);
-  }
-
-  if (getenv("DEBUG_mergeSpec")) {
-    fprintf (stderr, "mergeSpec: \"%s\"\n", name);
+#else
+    werror (E_SYNTAX_ERROR, yytext);
+    // the show must go on
+    return newIntLink();
+#endif
   }
 
   if (SPEC_NOUN(src)) {
@@ -605,23 +613,29 @@ mergeSpec (sym_link * dest, sym_link * src, char *name)
   dest->select.s._signed|=src->select.s._signed;
   SPEC_STAT (dest) |= SPEC_STAT (src);
   SPEC_EXTR (dest) |= SPEC_EXTR (src);
+  SPEC_CONST(dest) |= SPEC_CONST (src);
   SPEC_ABSA (dest) |= SPEC_ABSA (src);
-  SPEC_RENT (dest) |= SPEC_RENT (src);
-  SPEC_INTN (dest) |= SPEC_INTN (src);
-  SPEC_BANK (dest) |= SPEC_BANK (src);
   SPEC_VOLATILE (dest) |= SPEC_VOLATILE (src);
-  SPEC_CRTCL (dest) |= SPEC_CRTCL (src);
   SPEC_ADDR (dest) |= SPEC_ADDR (src);
   SPEC_OCLS (dest) = SPEC_OCLS (src);
   SPEC_BLEN (dest) |= SPEC_BLEN (src);
   SPEC_BSTR (dest) |= SPEC_BSTR (src);
   SPEC_TYPEDEF (dest) |= SPEC_TYPEDEF (src);
-  SPEC_NONBANKED (dest) |= SPEC_NONBANKED (src);
-  SPEC_NAKED (dest) |= SPEC_NAKED (src);
 
   if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL)
     SPEC_STRUCT (dest) = SPEC_STRUCT (src);
 
+  /* these are the only function attributes that will be set 
+     in a specifier while parsing */
+  FUNC_NONBANKED(dest) |= FUNC_NONBANKED(src);
+  FUNC_BANKED(dest) |= FUNC_BANKED(src);
+  FUNC_ISCRITICAL(dest) |= FUNC_ISCRITICAL(src);
+  FUNC_ISREENT(dest) |= FUNC_ISREENT(src);
+  FUNC_ISNAKED(dest) |= FUNC_ISNAKED(src);
+  FUNC_ISISR(dest) |= FUNC_ISISR(src);
+  FUNC_INTNO(dest) |= FUNC_INTNO(src);
+  FUNC_REGBANK(dest) |= FUNC_REGBANK(src);
+
   return symlink;
 }
 
@@ -768,8 +782,6 @@ getSize (sym_link * p)
   /* this is a specifier  */
   switch (DCL_TYPE (p))
     {
-    case FUNCTION:
-      return 2;
     case ARRAY:
       return DCL_ELEM (p) * getSize (p->next);
     case IPOINTER:
@@ -779,6 +791,7 @@ getSize (sym_link * p)
     case EEPPOINTER:
     case FPOINTER:
     case CPOINTER:
+    case FUNCTION:
       return (FPTRSIZE);
     case GPOINTER:
       return (GPTRSIZE);
@@ -827,8 +840,6 @@ bitsForType (sym_link * p)
   /* this is a specifier  */
   switch (DCL_TYPE (p))
     {
-    case FUNCTION:
-      return 2;
     case ARRAY:
       return DCL_ELEM (p) * getSize (p->next) * 8;
     case IPOINTER:
@@ -838,6 +849,7 @@ bitsForType (sym_link * p)
     case EEPPOINTER:
     case FPOINTER:
     case CPOINTER:
+    case FUNCTION:
       return (FPTRSIZE * 8);
     case GPOINTER:
       return (GPTRSIZE * 8);
@@ -882,9 +894,7 @@ copySymbol (symbol * src)
   dest->type = copyLinkChain (src->type);
   dest->etype = getSpec (dest->type);
   dest->next = NULL;
-  dest->args = copyValueChain (src->args);
   dest->key = src->key;
-  dest->calleeSave = src->calleeSave;
   dest->allocreq = src->allocreq;
   return dest;
 }
@@ -1002,7 +1012,7 @@ funcInChain (sym_link * lnk)
 /* structElemType - returns the type info of a sturct member        */
 /*------------------------------------------------------------------*/
 sym_link *
-structElemType (sym_link * stype, value * id, value ** argsp)
+structElemType (sym_link * stype, value * id)
 {
   symbol *fields = (SPEC_STRUCT (stype) ? SPEC_STRUCT (stype)->fields : NULL);
   sym_link *type, *etype;
@@ -1016,10 +1026,6 @@ structElemType (sym_link * stype, value * id, value ** argsp)
     {
       if (strcmp (fields->rname, id->name) == 0)
        {
-         if (argsp)
-           {
-             *argsp = fields->args;
-           }
          type = copyLinkChain (fields->type);
          etype = getSpec (type);
          SPEC_SCLS (etype) = (SPEC_SCLS (petype) == S_REGISTER ?
@@ -1100,10 +1106,12 @@ compStructSize (int su, structdef * sdef)
            sum += getSize (loop->type);
        }
 
+#if 0 // jwk: this is done now in addDecl()
        /* if function then do the arguments for it */
        if (funcInChain (loop->type)) {
-           processFuncArgs (loop, 1);
+           processFuncArgs (loop);
        }
+#endif
 
        loop = loop->next;
 
@@ -1133,9 +1141,6 @@ checkSClass (symbol * sym, int isProto)
   if (getenv("DEBUG_SANITY")) {
     fprintf (stderr, "checkSClass: %s \n", sym->name);
   }
-  if (strcmp(sym->name, "_testsGlobal")==0) {
-    printf ("oach\n");
-  }
   
   /* type is literal can happen foe enums change
      to auto */
@@ -1255,7 +1260,7 @@ checkSClass (symbol * sym, int isProto)
   if (sym->level && SPEC_SCLS (sym->etype) == S_FIXED &&
       !IS_STATIC(sym->etype))
     {
-      if (options.stackAuto || (currFunc && IS_RENT (currFunc->etype)))
+      if (options.stackAuto || (currFunc && IFFUNC_ISREENT (currFunc->type)))
        {
          SPEC_SCLS (sym->etype) = (options.useXstack ?
                                    S_XSTACK : S_STACK);
@@ -1423,6 +1428,8 @@ computeType (sym_link * type1, sym_link * type2)
        (!IS_LITERAL(type2) && SPEC_USIGN (etype2))) && 
       !IS_FLOAT (reType))
     SPEC_USIGN (reType) = 1;
+  else
+    SPEC_USIGN (reType) = 0;
   
   /* if result is a literal then make not so */
   if (IS_LITERAL (reType))
@@ -1451,14 +1458,24 @@ compareType (sym_link * dest, sym_link * src)
     {
       if (IS_DECL (src))
        {
-         if (DCL_TYPE (src) == DCL_TYPE (dest))
+         if (DCL_TYPE (src) == DCL_TYPE (dest)) {
+           if (IS_FUNC(src)) {
+             //checkFunction(src,dest);
+           }
            return compareType (dest->next, src->next);
-         if (IS_PTR (src) && IS_PTR (dest))
-           return -1;
-         if (IS_PTR (dest) && IS_ARRAY (src))
+         }
+         if (IS_PTR (src) && IS_GENPTR (dest))
            return -1;
+         if (IS_PTR (dest) && IS_ARRAY (src)) {
+           value *val=aggregateToPointer (valFromType(src));
+           int res=compareType (dest, val->type);
+           Safe_free(val->type);
+           Safe_free(val);
+           //return res ? -1 : 0;
+           return res;
+         }
          if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
-           return -1 * compareType (dest->next, src);
+           return compareType (dest->next, src);
          return 0;
        }
       else if (IS_PTR (dest) && IS_INTEGRAL (src))
@@ -1532,11 +1549,11 @@ inCalleeSaveList (char *s)
 }
 
 /*-----------------------------------------------------------------*/
-/* aggregateArgToPointer:  change an agggregate type function      */
+/* aggregateToPointer:  change an agggregate type function      */
 /*         argument to a pointer to that type.     */
 /*-----------------------------------------------------------------*/
-void 
-aggregateArgToPointer (value * val)
+value *
+aggregateToPointer (value * val)
 {
   if (IS_AGGREGATE (val->type))
     {
@@ -1563,8 +1580,12 @@ aggregateArgToPointer (value * val)
          DCL_TYPE (val->type) = PPOINTER;
          break;
        case S_FIXED:
-         if (TARGET_IS_DS390)
-           {
+         if (SPEC_OCLS(val->etype)) {
+           DCL_TYPE(val->type)=PTR_TYPE(SPEC_OCLS(val->etype));
+         } else {
+           // this should not happen
+           fprintf (stderr, "wild guess about storage type\n");
+           if (TARGET_IS_DS390) {
              /* The AUTO and REGISTER classes should probably
               * also become generic pointers, but I haven't yet
               * devised a test case for that.
@@ -1572,7 +1593,12 @@ aggregateArgToPointer (value * val)
              DCL_TYPE (val->type) = GPOINTER;
              break;
            }
-         /* fall through! */
+           if (options.model==MODEL_LARGE) {
+             DCL_TYPE (val->type) = FPOINTER;
+             break;
+           }
+         }
+         break;
        case S_AUTO:
        case S_DATA:
        case S_REGISTER:
@@ -1590,7 +1616,7 @@ aggregateArgToPointer (value * val)
        default:
          DCL_TYPE (val->type) = GPOINTER;
        }
-
+      
       /* is there is a symbol associated then */
       /* change the type of the symbol as well */
       if (val->sym)
@@ -1599,14 +1625,14 @@ aggregateArgToPointer (value * val)
          val->sym->etype = getSpec (val->sym->type);
        }
     }
+  return val;
 }
 /*------------------------------------------------------------------*/
 /* checkFunction - does all kinds of check on a function            */
 /*------------------------------------------------------------------*/
 int 
-checkFunction (symbol * sym)
+checkFunction (symbol * sym, symbol *csym)
 {
-  symbol *csym;
   value *exargs, *acargs;
   value *checkValue;
   int argCnt = 0;
@@ -1642,21 +1668,23 @@ checkFunction (symbol * sym)
 
   /* check if this function is defined as calleeSaves
      then mark it as such */
-  sym->calleeSave = inCalleeSaveList (sym->name);
+    FUNC_CALLEESAVES(sym->type) = inCalleeSaveList (sym->name);
 
   /* if interrupt service routine  */
   /* then it cannot have arguments */
-  if (sym->args && IS_ISR (sym->etype) && !IS_VOID (sym->args->type))
+  if (IFFUNC_ARGS(sym->type) && FUNC_ISISR (sym->type))
     {
-      werror (E_INT_ARGS, sym->name);
-      sym->args = NULL;
+      if (!IS_VOID(FUNC_ARGS(sym->type)->type)) {
+       werror (E_INT_ARGS, sym->name);
+       FUNC_ARGS(sym->type)=NULL;
+      }
     }
 
-  if (!(csym = findSym (SymbolTab, sym, sym->name)))
+  if (!csym && !(csym = findSym (SymbolTab, sym, sym->name)))
     return 1;                  /* not defined nothing more to check  */
 
   /* check if body already present */
-  if (csym && csym->fbody)
+  if (csym && IFFUNC_HASBODY(csym->type))
     {
       werror (E_FUNC_BODY, sym->name);
       return 0;
@@ -1666,33 +1694,28 @@ checkFunction (symbol * sym)
   if (compareType (csym->type, sym->type) <= 0)
     {
       werror (E_PREV_DEF_CONFLICT, csym->name, "type");
-      werror (W_CONTINUE, "previous definition type ");
-      printTypeChain (csym->type, stderr);
-      fprintf (stderr, "\n");
-      werror (W_CONTINUE, "current definition type ");
-      printTypeChain (sym->type, stderr);
-      fprintf (stderr, "\n");
+      printFromToType(csym->type, sym->type);
       return 0;
     }
 
-  if (SPEC_INTRTN (csym->etype) != SPEC_INTRTN (sym->etype))
+  if (FUNC_ISISR (csym->type) != FUNC_ISISR (sym->type))
     {
       werror (E_PREV_DEF_CONFLICT, csym->name, "interrupt");
     }
 
-  if (SPEC_BANK (csym->etype) != SPEC_BANK (sym->etype))
+  if (FUNC_REGBANK (csym->type) != FUNC_REGBANK (sym->type))
     {
       werror (E_PREV_DEF_CONFLICT, csym->name, "using");
     }
 
-  if (SPEC_NAKED (csym->etype) != SPEC_NAKED (sym->etype))
+  if (IFFUNC_ISNAKED (csym->type) != IFFUNC_ISNAKED (sym->type))
     {
       werror (E_PREV_DEF_CONFLICT, csym->name, "_naked");
     }
 
-  /* compare expected agrs with actual args */
-  exargs = csym->args;
-  acargs = sym->args;
+  /* compare expected args with actual args */
+  exargs = FUNC_ARGS(csym->type);
+  acargs = FUNC_ARGS(sym->type);
 
   /* for all the expected args do */
   for (argCnt = 1;
@@ -1712,7 +1735,7 @@ checkFunction (symbol * sym)
       if (IS_AGGREGATE (acargs->type))
        {
          checkValue = copyValue (acargs);
-         aggregateArgToPointer (checkValue);
+         aggregateToPointer (checkValue);
        }
       else
        {
@@ -1722,6 +1745,7 @@ checkFunction (symbol * sym)
       if (compareType (exargs->type, checkValue->type) <= 0)
        {
          werror (E_ARG_TYPE, argCnt);
+         printFromToType(exargs->type, checkValue->type);
          return 0;
        }
     }
@@ -1747,26 +1771,36 @@ checkFunction (symbol * sym)
 /* processFuncArgs - does some processing with function args       */
 /*-----------------------------------------------------------------*/
 void 
-processFuncArgs (symbol * func, int ignoreName)
+processFuncArgs (symbol * func)
 {
   value *val;
   int pNum = 1;
+  sym_link *funcType=func->type;
+
+  if (getenv("SDCC_DEBUG_FUNCTION_POINTERS"))
+    fprintf (stderr, "SDCCsymt.c:processFuncArgs(%s)\n", func->name);
+
+  // if this is a pointer to a function
+  if (IS_PTR(funcType)) {
+    funcType=funcType->next;
+  }
 
   /* if this function has variable argument list */
   /* then make the function a reentrant one    */
-  if (func->hasVargs)
-    SPEC_RENT (func->etype) = 1;
+  if (IFFUNC_HASVARARGS(funcType))
+    FUNC_ISREENT(funcType)=1;
 
   /* check if this function is defined as calleeSaves
      then mark it as such */
-  func->calleeSave = inCalleeSaveList (func->name);
+  FUNC_CALLEESAVES(funcType) = inCalleeSaveList (func->name);
 
-  val = func->args;            /* loop thru all the arguments   */
+  /* loop thru all the arguments   */
+  val = FUNC_ARGS(funcType);
 
   /* if it is void then remove parameters */
   if (val && IS_VOID (val->type))
     {
-      func->args = NULL;
+      FUNC_ARGS(funcType) = NULL;
       return;
     }
 
@@ -1779,7 +1813,7 @@ processFuncArgs (symbol * func, int ignoreName)
       /* mark it as a register parameter if
          the function does not have VA_ARG
          and as port dictates */
-      if (!func->hasVargs &&
+      if (!IFFUNC_HASVARARGS(funcType) &&
          (*port->reg_parm) (val->type))
        {
          SPEC_REGPARM (val->etype) = 1;
@@ -1787,8 +1821,9 @@ processFuncArgs (symbol * func, int ignoreName)
 
       if (IS_AGGREGATE (val->type))
        {
-         aggregateArgToPointer (val);
+         aggregateToPointer (val);
        }
+
       val = val->next;
       pNum++;
     }
@@ -1797,17 +1832,17 @@ processFuncArgs (symbol * func, int ignoreName)
   if (func->cdef) {
     /* ignore --stack-auto for this one, we don't know how it is compiled */
     /* simply trust on --int-long-reent or --float-reent */
-    if (IS_RENT(func->etype)) {
+    if (IFFUNC_ISREENT(funcType)) {
       return;
     }
   } else {
     /* if this function is reentrant or */
     /* automatics r 2b stacked then nothing */
-    if (IS_RENT (func->etype) || options.stackAuto)
+    if (IFFUNC_ISREENT (funcType) || options.stackAuto)
       return;
   }
 
-  val = func->args;
+  val = FUNC_ARGS(funcType);
   pNum = 1;
   while (val)
     {
@@ -1886,7 +1921,7 @@ printTypeChain (sym_link * start, FILE * of)
     }
 
   if (start==NULL) {
-    fprintf (of, "**err**");
+    fprintf (of, "void");
     return;
   }
 
@@ -1904,22 +1939,22 @@ printTypeChain (sym_link * start, FILE * of)
          switch (DCL_TYPE (type))
            {
            case FUNCTION:
-             fprintf (of, "function");
+             fprintf (of, "function ");
              break;
            case GPOINTER:
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
-             fprintf (of, "generic *");
+             fprintf (of, "generic * ");
              break;
            case CPOINTER:
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
-             fprintf (of, "code *");
+             fprintf (of, "code * ");
              break;
            case FPOINTER:
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
-             fprintf (of, "far *");
+             fprintf (of, "xdata * ");
              break;
            case EEPPOINTER:
              if (DCL_PTR_CONST (type))
@@ -1935,25 +1970,42 @@ printTypeChain (sym_link * start, FILE * of)
            case IPOINTER:
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
-             fprintf (of, "idata *");
+             fprintf (of, "idata * ");
              break;
            case PPOINTER:
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
-             fprintf (of, "pdata *");
+             fprintf (of, "pdata * ");
              break;
            case UPOINTER:
              if (DCL_PTR_CONST (type))
                fprintf (of, "const ");
-             fprintf (of, "unkown *");
+             fprintf (of, "unkown * ");
              break;
            case ARRAY:
-             fprintf (of, "array of");
+             fprintf (of, "[] ");
              break;
            }
        }
       else
        {
+         switch (SPEC_SCLS(type)) 
+           {
+           case S_DATA: fprintf (of, "data "); break;
+           case S_XDATA: fprintf (of, "xdata "); break;
+           case S_SFR: fprintf (of, "sfr "); break;
+           case S_SBIT: fprintf (of, "sbit "); break;
+           case S_CODE: fprintf (of, "code "); break;
+           case S_IDATA: fprintf (of, "idata "); break;
+           case S_PDATA: fprintf (of, "pdata "); break;
+           case S_LITERAL: fprintf (of, "literal "); break;
+           case S_STACK: fprintf (of, "stack "); break;
+           case S_XSTACK: fprintf (of, "xstack "); break;
+           case S_BIT: fprintf (of, "bit "); break;
+           case S_EEPROM: fprintf (of, "eeprom "); break;
+           default: break;
+           }
+
          if (SPEC_VOLATILE (type))
            fprintf (of, "volatile ");
          if (SPEC_USIGN (type))
@@ -2157,8 +2209,8 @@ cdbSymbol (symbol * sym, FILE * of, int isStructSym, int isFunc)
      if is it an interrupt routine & interrupt number
      and the register bank it is using */
   if (isFunc)
-    fprintf (of, ",%d,%d,%d", SPEC_INTRTN (sym->etype),
-            SPEC_INTN (sym->etype), SPEC_BANK (sym->etype));
+    fprintf (of, ",%d,%d,%d", FUNC_ISISR (sym->type),
+            FUNC_INTNO (sym->type), FUNC_REGBANK (sym->type));
   /* alternate location to find this symbol @ : eg registers
      or spillication */
 
@@ -2367,7 +2419,7 @@ initCSupport ()
                       ssu[su],
                       sbwd[bwd]);
               __muldiv[muldivmod][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent);
-             SPEC_NONBANKED (__muldiv[muldivmod][bwd][su]->etype) = 1;
+             FUNC_NONBANKED (__muldiv[muldivmod][bwd][su]->type) = 1;
            }
        }
     }
@@ -2383,7 +2435,7 @@ initCSupport ()
                       ssu[su],
                       sbwd[bwd]);
               __rlrr[rlrr][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[0][0], 2, options.intlong_rent);
-             SPEC_NONBANKED (__rlrr[rlrr][bwd][su]->etype) = 1;
+             FUNC_NONBANKED (__rlrr[rlrr][bwd][su]->type) = 1;
            }
        }
     }