These are known
[fw/sdcc] / src / SDCCsymt.c
index 6c199ee414895c94bf96c738e06d645b5554a4e4..f830136954bce1767e639ed8b77cac9d9f8f9db2 100644 (file)
@@ -412,7 +412,7 @@ addDecl (symbol * sym, int type, sym_link * p)
     {
       if (IS_SPEC (sym->etype) && IS_SPEC (head) && head == tail)
        {
-         sym->etype = mergeSpec (sym->etype, head);
+         sym->etype = mergeSpec (sym->etype, head, sym->name);
        }
       else
        {
@@ -499,7 +499,7 @@ void checkTypeSanity(sym_link *etype, char *name) {
 
   // special case for "short"
   if (etype->select.s._short) {
-    SPEC_NOUN(etype) = options.shortisint ? V_INT : V_CHAR;
+    SPEC_NOUN(etype) = options.shortis8bits ? V_CHAR : V_INT;
     etype->select.s._short = 0;
   }
 
@@ -524,10 +524,36 @@ void checkTypeSanity(sym_link *etype, char *name) {
 /*------------------------------------------------------------------*/
 /* mergeSpec - merges two specifiers and returns the new one        */
 /*------------------------------------------------------------------*/
+#define LAST_MINUTE_2_3_0_FIX
 sym_link *
-mergeSpec (sym_link * dest, sym_link * src)
+mergeSpec (sym_link * dest, sym_link * src, char *name)
 {
 
+#ifdef LAST_MINUTE_2_3_0_FIX
+  sym_link *symlink;
+
+  if (!IS_SPEC(dest)) {
+    // This should not happen
+    fprintf (stderr, "*** internal error: can't merge declarators\n");
+  }
+  if (!IS_SPEC(src)) {
+    // here we have a declarator as source, reverse them
+    symlink=src;
+    src=dest;
+    dest=symlink;
+    while (!IS_SPEC(dest)) {
+      // and find the specifier
+      dest=dest->next;
+    }
+  } else {
+    symlink=dest;
+  }
+#endif
+
+  if (getenv("DEBUG_mergeSpec")) {
+    fprintf (stderr, "mergeSpec: \"%s\"\n", name);
+  }
+
   if (SPEC_NOUN(src)) {
     if (!SPEC_NOUN(dest)) {
       SPEC_NOUN(dest)=SPEC_NOUN(src);
@@ -536,7 +562,7 @@ mergeSpec (sym_link * dest, sym_link * src)
       if (getenv("DEBUG_SANITY")) {
        fprintf (stderr, "mergeSpec: ");
       }
-      werror(E_TWO_OR_MORE_DATA_TYPES, yylval.yychar);
+      werror(E_TWO_OR_MORE_DATA_TYPES, name);
     }
   }
   
@@ -548,7 +574,7 @@ mergeSpec (sym_link * dest, sym_link * src)
       if (getenv("DEBUG_SANITY")) {
        fprintf (stderr, "mergeSpec: ");
       }
-      werror(E_TWO_OR_MORE_STORAGE_CLASSES, yylval.yychar);
+      werror(E_TWO_OR_MORE_STORAGE_CLASSES, name);
     }
   }
 
@@ -588,7 +614,11 @@ mergeSpec (sym_link * dest, sym_link * src)
   if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL)
     SPEC_STRUCT (dest) = SPEC_STRUCT (src);
 
+#ifdef LAST_MINUTE_2_3_0_FIX
+  return symlink;
+#else
   return dest;
+#endif
 }
 
 /*------------------------------------------------------------------*/
@@ -931,7 +961,7 @@ addSymChain (symbol * symHead)
          if (IS_EXTERN (csym->etype))
            {
              /* do types match ? */
-             if (checkType (csym->type, sym->type) != 1)
+             if (compareType (csym->type, sym->type) != 1)
                /* no then error */
                werror (E_DUPLICATE, csym->name);
 
@@ -952,7 +982,7 @@ addSymChain (symbol * symHead)
          /* then check the type with the current one         */
          if (IS_EXTERN (csym->etype))
            {
-             if (checkType (csym->type, sym->type) <= 0)
+             if (compareType (csym->type, sym->type) <= 0)
                werror (W_EXTERN_MISMATCH, csym->name);
            }
        }
@@ -1174,6 +1204,7 @@ checkSClass (symbol * sym)
       sym->ival = NULL;
     }
 
+#if 0
   /* if this is an automatic symbol then */
   /* storage class will be ignored and   */
   /* symbol will be allocated on stack/  */
@@ -1189,6 +1220,23 @@ checkSClass (symbol * sym)
       werror (E_AUTO_ASSUMED, sym->name);
       SPEC_SCLS (sym->etype) = S_AUTO;
     }
+#else
+  /* if this is an atomatic symbol */
+  if (sym->level && (options.stackAuto || reentrant)) {
+    if ((SPEC_SCLS (sym->etype) == S_AUTO ||
+        SPEC_SCLS (sym->etype) == S_FIXED ||
+        SPEC_SCLS (sym->etype) == S_REGISTER ||
+        SPEC_SCLS (sym->etype) == S_STACK ||
+        SPEC_SCLS (sym->etype) == S_XSTACK)) {
+      SPEC_SCLS (sym->etype) = S_AUTO;
+    } else {
+      /* storage class may only be specified for statics */
+      if (!IS_STATIC(sym->etype)) {
+       werror (E_AUTO_ASSUMED, sym->name);
+      }
+    }
+  }
+#endif
   
   /* automatic symbols cannot be given   */
   /* an absolute address ignore it      */
@@ -1406,10 +1454,10 @@ computeType (sym_link * type1, sym_link * type2)
 }
 
 /*------------------------------------------------------------------*/
-/* checkType - will do type check return 1 if match                 */
+/* compareType - will do type check return 1 if match                 */
 /*------------------------------------------------------------------*/
 int 
-checkType (sym_link * dest, sym_link * src)
+compareType (sym_link * dest, sym_link * src)
 {
   if (!dest && !src)
     return 1;
@@ -1426,13 +1474,13 @@ checkType (sym_link * dest, sym_link * src)
       if (IS_DECL (src))
        {
          if (DCL_TYPE (src) == DCL_TYPE (dest))
-           return checkType (dest->next, src->next);
+           return compareType (dest->next, src->next);
          else if (IS_PTR (src) && IS_PTR (dest))
            return -1;
          else if (IS_PTR (dest) && IS_ARRAY (src))
            return -1;
          else if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src))
-           return -1 * checkType (dest->next, src);
+           return -1 * compareType (dest->next, src);
          else
            return 0;
        }
@@ -1638,7 +1686,7 @@ checkFunction (symbol * sym)
     }
 
   /* check the return value type   */
-  if (checkType (csym->type, sym->type) <= 0)
+  if (compareType (csym->type, sym->type) <= 0)
     {
       werror (E_PREV_DEF_CONFLICT, csym->name, "type");
       werror (E_CONTINUE, "previous definition type ");
@@ -1694,7 +1742,7 @@ checkFunction (symbol * sym)
          checkValue = acargs;
        }
 
-      if (checkType (exargs->type, checkValue->type) <= 0)
+      if (compareType (exargs->type, checkValue->type) <= 0)
        {
          werror (E_ARG_TYPE, argCnt);
          return 0;
@@ -2232,6 +2280,19 @@ _makeRegParam (symbol * sym)
     }
 }
 
+static char *
+_mangleFunctionName(char *in)
+{
+  if (port->getMangledFunctionName) 
+    {
+      return port->getMangledFunctionName(in);
+    }
+  else
+    {
+      return in;
+    }
+}
+
 /*-----------------------------------------------------------------*/
 /* initCSupport - create functions for C support routines          */
 /*-----------------------------------------------------------------*/
@@ -2297,12 +2358,12 @@ initCSupport ()
              if (tofrom)
                {
                  sprintf (buffer, "__fs2%s%s", ssu[su], sbwd[bwd]);
-                 __conv[tofrom][bwd][su] = funcOfType (buffer, __multypes[bwd][su], floatType, 1, options.float_rent);
+                 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], floatType, 1, options.float_rent);
                }
              else
                {
                  sprintf (buffer, "__%s%s2fs", ssu[su], sbwd[bwd]);
-                 __conv[tofrom][bwd][su] = funcOfType (buffer, floatType, __multypes[bwd][su], 1, options.float_rent);
+                 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), floatType, __multypes[bwd][su], 1, options.float_rent);
                }
            }
        }
@@ -2318,7 +2379,7 @@ initCSupport ()
                       smuldivmod[muldivmod],
                       ssu[su],
                       sbwd[bwd]);
-              __muldiv[muldivmod][bwd][su] = funcOfType (buffer, __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent);
+              __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;
              if (bwd < port->muldiv.force_reg_param_below)
                _makeRegParam (__muldiv[muldivmod][bwd][su]);