(createInterruptVect): don't append 7(5) padding bytes for last interrupt vector...
[fw/sdcc] / src / SDCCmain.c
index 6ac338a433de2db8aebda684befc647847371f41..d864adb91a1e0b725fbf600f380fb6beceb5637c 100644 (file)
@@ -123,7 +123,7 @@ char buffer[PATH_MAX * 2];
 #define OPTION_ICODE_IN_ASM    "--i-code-in-asm"
 #define OPTION_PRINT_SEARCH_DIRS "--print-search-dirs"
 #define OPTION_MSVC_ERROR_STYLE "--vc"
-#define OPTION_USE_STDOUT "--use-stdout"
+#define OPTION_USE_STDOUT       "--use-stdout"
 
 static const OPTION
 optionsTable[] = {
@@ -227,9 +227,6 @@ optionsTable[] = {
     { 0,    OPTION_USE_STDOUT, &options.use_stdout, "send errors to stdout instead of stderr"},
 #if !OPT_DISABLE_Z80 || !OPT_DISABLE_GBZ80
     { 0,    "--no-std-crt0", &options.no_std_crt0, "For the z80/gbz80 do not link default crt0.o"},
-#endif
-#if !OPT_DISABLE_PIC16
-    { 0,    "--gen-banksel",       &options.gen_banksel, "enable the generation of banksel assembler directives in PIC16 port"},
 #endif
     /* End of options */
     { 0,    NULL }
@@ -289,12 +286,12 @@ static PORT *_ports[] =
 #if !OPT_DISABLE_DS390
   &ds390_port,
 #endif
-#if !OPT_DISABLE_PIC
-  &pic_port,
-#endif
 #if !OPT_DISABLE_PIC16
   &pic16_port,
 #endif
+#if !OPT_DISABLE_PIC
+  &pic_port,
+#endif
 #if !OPT_DISABLE_TININative
   &tininative_port,
 #endif
@@ -303,7 +300,10 @@ static PORT *_ports[] =
 #endif
 #if !OPT_DISABLE_DS400
   &ds400_port, 
-#endif 
+#endif
+#if !OPT_DISABLE_HC08
+  &hc08_port,
+#endif
 };
 
 #define NUM_PORTS (sizeof(_ports)/sizeof(_ports[0]))
@@ -372,13 +372,7 @@ _findPort (int argc, char **argv)
     }
 
   /* Use the first in the list */
-#if defined(DEFAULT_PORT)
-       /* VR - 13/5/2003 DEFAULT_PORT is defined in port.h */
-       port = &DEFAULT_PORT;
-#else
        port = _ports[0];
-#endif
-
 }
 
 /* search through the command line options for the processor */
@@ -408,12 +402,8 @@ printVersionInfo (void)
 
   fprintf (stderr,
           "SDCC : ");
-  for (i = 0; i < NUM_PORTS; i++) {
+  for (i = 0; i < NUM_PORTS; i++)
     fprintf (stderr, "%s%s", i == 0 ? "" : "/", _ports[i]->target);
-#ifdef DEFAULT_PORT
-       fprintf(stderr, "%s", (&DEFAULT_PORT == _ports[i])?"*":"");
-#endif
-  }
   
   fprintf (stderr, " " SDCC_VERSION_STR
 #ifdef SDCC_SUB_VERSION_STR
@@ -490,7 +480,7 @@ setParseWithComma (set **dest, char *src)
   /* skip the initial white spaces */
   while (isspace(*src))
     src++;
-
+  
   /* skip the trailing white spaces */
   length = strlen(src);
   while (length && isspace(src[length-1]))
@@ -647,7 +637,7 @@ _setModel (int model, const char *sz)
 /** Gets the string argument to this option.  If the option is '--opt'
     then for input of '--optxyz' or '--opt xyz' returns xyz.
 */
-static char *
+char *
 getStringArg(const char *szStart, char **argv, int *pi, int argc)
 {
   if (argv[*pi][strlen(szStart)])
@@ -673,7 +663,7 @@ getStringArg(const char *szStart, char **argv, int *pi, int argc)
 /** Gets the integer argument to this option using the same rules as
     getStringArg.
 */
-static int
+int
 getIntArg(const char *szStart, char **argv, int *pi, int argc)
 {
     return (int)floatFromVal(constVal(getStringArg(szStart, argv, pi, argc)));
@@ -1124,8 +1114,11 @@ parseCmdLine (int argc, char **argv)
            case 'M':
              {
                preProcOnly = 1;
-               addSet(&preArgvSet, Safe_strdup("-M"));
-               break;
+                if (argv[i][2] == 'M')
+                 addSet(&preArgvSet, Safe_strdup("-MM"));
+                else
+                 addSet(&preArgvSet, Safe_strdup("-M"));
+               break;
              }
            case 'C':
              {
@@ -1294,6 +1287,8 @@ linkEdit (char **envp)
   int system_ret;
   const char *s;
 
+
+  if(port->linker.needLinkerScript) {
   /* first we need to create the <filename>.lnk file */
   SNPRINTF (scratchFileName, sizeof(scratchFileName),
            "%s.lnk", dstFileName);
@@ -1387,7 +1382,7 @@ linkEdit (char **envp)
   /* standard library path */
     if (!options.nostdlib)
     {
-        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80)) /*Not for the z80, gbz80*/
+        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80 || TARGET_IS_HC08)) /*Not for the z80, gbz80*/
         {
             switch (options.model)
             {
@@ -1426,7 +1421,9 @@ linkEdit (char **envp)
         }
         else /*for the z80, gbz80*/
         {
-            if (TARGET_IS_Z80)
+            if (TARGET_IS_HC08)
+                c = "hc08";
+            else if (TARGET_IS_Z80)
                 c = "z80";
             else
                 c = "gbz80";
@@ -1465,13 +1462,18 @@ linkEdit (char **envp)
         }
 #endif
 #endif
-        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80)) /*Not for the z80, gbz80*/
+        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80
+              || TARGET_IS_HC08)) /*Not for the z80, gbz80*/
         { /*Why the z80 port is not using the standard libraries?*/
             fprintf (lnkfile, "-l %s\n", STD_LIB);
             fprintf (lnkfile, "-l %s\n", STD_INT_LIB);
             fprintf (lnkfile, "-l %s\n", STD_LONG_LIB);
             fprintf (lnkfile, "-l %s\n", STD_FP_LIB);
         }
+        else if (TARGET_IS_HC08)
+        {
+            fprintf (lnkfile, "-l hc08\n");
+        }
         else if (TARGET_IS_Z80)
         {
             fprintf (lnkfile, "-l z80\n");
@@ -1528,6 +1530,7 @@ linkEdit (char **envp)
 
   fprintf (lnkfile, "\n-e\n");
   fclose (lnkfile);
+  }    /* if(port->linker.needLinkerScript) */
 
   if (options.verbose)
     printf ("sdcc: Calling linker...\n");
@@ -1606,6 +1609,8 @@ linkEdit (char **envp)
       strncatz (scratchFileName,
                options.out_fmt ? ".S19" : ".ihx",
                sizeof(scratchFileName));
+      if (strcmp (fullDstFileName, scratchFileName))
+       unlink (fullDstFileName);
       rename (scratchFileName, fullDstFileName);
 
       strncpyz (buffer, fullDstFileName, sizeof(buffer));
@@ -1620,12 +1625,32 @@ linkEdit (char **envp)
       strncatz (scratchFileName, ".map", sizeof(scratchFileName));
       *q = 0;
       strncatz(buffer, ".map", sizeof(buffer));
+      if (strcmp (scratchFileName, buffer))
+       unlink (buffer);
       rename (scratchFileName, buffer);
       *p = 0;
       strncatz (scratchFileName, ".mem", sizeof(scratchFileName));
       *q = 0;
       strncatz(buffer, ".mem", sizeof(buffer));
+      if (strcmp (scratchFileName, buffer))
+        unlink (buffer);
       rename (scratchFileName, buffer);
+      if (options.debug)
+        {
+          *p = 0;
+          strncatz (scratchFileName, ".cdb", sizeof(scratchFileName));
+          *q = 0;
+          strncatz(buffer, ".cdb", sizeof(buffer));
+          if (strcmp (scratchFileName, buffer))
+            unlink (buffer);
+          rename (scratchFileName, buffer);
+          /* and the OMF file without extension: */
+          *p = 0;
+          *q = 0;
+          if (strcmp (scratchFileName, buffer))
+            unlink (buffer);
+          rename (scratchFileName, buffer);
+        }
     }
   if (system_ret)
     {
@@ -1675,6 +1700,8 @@ assemble (char **envp)
         strncatz (scratchFileName, 
                  port->linker.rel_ext,
                  sizeof(scratchFileName));
+        if (strcmp (scratchFileName, fullDstFileName))
+          unlink (fullDstFileName);
         rename (scratchFileName, fullDstFileName);
     }
 }
@@ -2085,6 +2112,10 @@ main (int argc, char **argv, char **envp)
           glue();
         }
 
+      if (fatalError) {
+        exit (1);
+      }
+
       if (!options.c1mode && !noAssemble)
         {
           if (options.verbose)