added _JavaNative to debug info printing
[fw/sdcc] / src / SDCCglue.c
index a0f982254f7dc92083c4f27e28e112f57763778b..7f8f3d70a4d0ad1581b794b374db04df8af23c30 100644 (file)
@@ -180,7 +180,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
       /* if extern then add it into the extern list */
       if (IS_EXTERN (sym->etype))
        {
-         addSetHead (&externs, sym);
+          addSetHead (&externs, sym);
          continue;
        }
 
@@ -239,7 +239,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
          sprintf (newSym->name, "_xinit_%s", sym->name);
          sprintf (newSym->rname,"_xinit_%s", sym->rname);
          SPEC_CONST(newSym->etype)=1;
-         SPEC_STAT(newSym->etype)=1;
+         //SPEC_STAT(newSym->etype)=1;
          addSym (SymbolTab, newSym, newSym->name, 0, 0, 1);
          
          // add it to the "XINIT (CODE)" segment
@@ -259,12 +259,23 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
                            decorateType (resolveSymbols (list2expr (sym->ival))));
          }
          codeOutFile = statsg->oFile;
-         allocInfo = 0;
-         
-         // set ival's lineno to where the symbol was defined
-         if (ival) ival->lineno=sym->lineDef;
-         eBBlockFromiCode (iCodeFromAst (ival));
-         allocInfo = 1;
+
+         if (ival) {
+           // set ival's lineno to where the symbol was defined
+           lineno=ival->lineno=sym->lineDef;
+#if 0      
+           // check if this is a constant expression
+           if (constExprTree(ival->right)) {
+             allocInfo = 0;
+#endif
+             eBBlockFromiCode (iCodeFromAst (ival));
+             allocInfo = 1;
+#if 0
+           } else {
+             werror (E_CONST_EXPECTED, "found expression");
+           }
+#endif
+         }
        }         
 
        /* if the ival is a symbol assigned to an aggregate,
@@ -292,23 +303,26 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag)
                   sym->rname,
                   SPEC_ADDR (sym->etype));
        }
-      else
-       {
+      else {
          if (newSym) {
-           // this has been moved to another segment
+             // this has been moved to another segment
          } else {
-           /* allocate space */
-           if (options.debug) {
-             fprintf (map->oFile, "==.\n");
-           }
-           if (IS_STATIC (sym->etype))
-             tfprintf (map->oFile, "!slabeldef\n", sym->rname);
-           else
-             tfprintf (map->oFile, "!labeldef\n", sym->rname);
-           tfprintf (map->oFile, "\t!ds\n", 
-                     (unsigned int) getSize (sym->type) & 0xffff);
+             int size = getSize (sym->type);
+             if (size==0) {
+                 werror(E_UNKNOWN_SIZE,sym->name);
+             }
+             /* allocate space */
+             if (options.debug) {
+                 fprintf (map->oFile, "==.\n");
+             }
+             if (IS_STATIC (sym->etype))
+                 tfprintf (map->oFile, "!slabeldef\n", sym->rname);
+             else
+                 tfprintf (map->oFile, "!labeldef\n", sym->rname);           
+             tfprintf (map->oFile, "\t!ds\n", 
+                       (unsigned int)  size & 0xffff);
          }
-       }
+      }
     }
 }
 
@@ -556,7 +570,11 @@ printIvalType (symbol *sym, sym_link * type, initList * ilist, FILE * oFile)
          werror (W_EXCESS_INITIALIZERS, "scalar", sym->name, sym->lineDef);
        }
 
-       val = list2val (ilist);
+       if (!(val = list2val (ilist))) {
+         // assuming a warning has been thrown
+         val=constVal("0");
+       }
+
        if (val->type != type) {
          val = valCastLiteral(type, floatFromVal(val));
        }
@@ -1043,7 +1061,9 @@ emitStaticSeg (memmap * map, FILE * out)
       /* if it is not static add it to the public
          table */
       if (!IS_STATIC (sym->etype))
-       addSetHead (&publics, sym);
+        {
+          addSetHead (&publics, sym);
+        }
 
       /* print extra debug info if required */
       if (options.debug) {
@@ -1086,18 +1106,22 @@ emitStaticSeg (memmap * map, FILE * out)
              printIval (sym, sym->type, sym->ival, out);
              noAlloc--;
            }
-         else
-           {
+         else {
              /* allocate space */
+             int size = getSize (sym->type);
+             
+             if (size==0) {
+                 werror(E_UNKNOWN_SIZE,sym->name);
+             }
              fprintf (out, "%s:\n", sym->rname);
              /* special case for character strings */
              if (IS_ARRAY (sym->type) && IS_CHAR (sym->type->next) &&
                  SPEC_CVAL (sym->etype).v_char)
-               printChar (out,
-                          SPEC_CVAL (sym->etype).v_char,
-                          strlen (SPEC_CVAL (sym->etype).v_char) + 1);
+                 printChar (out,
+                            SPEC_CVAL (sym->etype).v_char,
+                            strlen (SPEC_CVAL (sym->etype).v_char) + 1);
              else
-               tfprintf (out, "\t!ds\n", (unsigned int) getSize (sym->type) & 0xffff);
+                 tfprintf (out, "\t!ds\n", (unsigned int) size & 0xffff);
            }
        }
     }
@@ -1248,7 +1272,7 @@ printExterns (FILE * afile)
 
   for (sym = setFirstItem (externs); sym;
        sym = setNextItem (externs))
-    tfprintf (afile, "\t!global\n", sym->rname);
+    tfprintf (afile, "\t!extern\n", sym->rname);
 }
 
 /*-----------------------------------------------------------------*/
@@ -1304,7 +1328,9 @@ emitOverlay (FILE * afile)
             and addPublics allowed then add it to the public set */
          if ((sym->_isparm && !IS_REGPARM (sym->etype))
              && !IS_STATIC (sym->etype))
-           addSetHead (&publics, sym);
+            {
+              addSetHead (&publics, sym);
+            }
 
          /* if extern then do nothing or is a function
             then do nothing */
@@ -1342,16 +1368,20 @@ emitOverlay (FILE * afile)
                       sym->rname,
                       SPEC_ADDR (sym->etype));
            }
-         else
-           {
+         else {
+             int size = getSize(sym->type);
+
+             if (size==0) {
+                 werror(E_UNKNOWN_SIZE,sym->name);
+             }       
              if (options.debug)
-               fprintf (afile, "==.\n");
+                 fprintf (afile, "==.\n");
              
              /* allocate space */
              tfprintf (afile, "!labeldef\n", sym->rname);
              tfprintf (afile, "\t!ds\n", (unsigned int) getSize (sym->type) & 0xffff);
-           }
-
+         }
+         
        }
     }
 }
@@ -1603,6 +1633,9 @@ glue ()
     }
   copyFile (asmFile, code->oFile);
 
+  if (port->genAssemblerEnd) {
+      port->genAssemblerEnd(asmFile);
+  }
   fclose (asmFile);
   applyToSet (tmpfileSet, closeTmpFiles);
   applyToSet (tmpfileNameSet, rmTmpFiles);