* device/lib/z80/printf.c: Changed emitter to volatile to work
[fw/sdcc] / src / SDCCmain.c
index 6bf1381fe25bd110a15fcd49ef6e71e59f7874a8..c1510d14e16761f8a13c1e3e22a45e8e29046aa4 100644 (file)
@@ -30,6 +30,7 @@
 #include "MySystem.h"
 #include "SDCCmacro.h"
 #include "SDCCutil.h"
+#include "SDCCargs.h"
 
 #if NATIVE_WIN32
 #include <process.h>
@@ -115,29 +116,10 @@ char DefaultExePath[128];
 #define OPTION_SHORT_IS_8BITS  "--short-is-8bits"
 #define OPTION_TINI_LIBID      "--tini-libid"
 
-/** Table of all options supported by all ports.
-    This table provides:
-      * A reference for all options.
-      * An easy way to maintain help for the options.
-      * Automatic support for setting flags on simple options.
-*/
-typedef struct {
-    /** The short option character e.g. 'h' for -h.  0 for none. */
-    char shortOpt;
-    /** Long option e.g. "--help".  Includes the -- prefix.  NULL for
-        none. */
-    const char *longOpt;
-    /** Pointer to an int that will be incremented every time the
-        option is encountered.  May be NULL.
-    */
-    int *pparameter;
-    /** Help text to go with this option.  May be NULL. */
-    const char *help;
-} OPTION;
-
 static const OPTION 
 optionsTable[] = {
     { 'm',  NULL,                   NULL, "Set the port to use e.g. -mz80." },
+    { 'p',  NULL,                   NULL, "Select port specific processor e.g. -mpic14 -p16f84" },
     { 'd',  NULL,                   NULL, NULL },
     { 'D',  NULL,                   NULL, "Define macro as in -Dmacro" },
     { 'I',  NULL,                   NULL, "Add to the include (*.h) path, as in -Ipath" },
@@ -213,7 +195,9 @@ optionsTable[] = {
     { 0,    "--stack-probe",               &options.stack_probe,"insert call to function __stack_probe at each function prologue"},
     { 0,    "--tini-libid",        NULL,"<nnnn> LibraryID used in -mTININative"},
     { 0,    "--protect-sp-update",  &options.protect_sp_update,"DS390 - will disable interrupts during ESP:SP updates"},
-    { 0,    "--parms-in-bank1",            &options.parms_in_bank1,"MCS51/DS390 - use Bank1 for parameter passing"}
+    { 0,    "--parms-in-bank1",            &options.parms_in_bank1,"MCS51/DS390 - use Bank1 for parameter passing"},
+    /* End of options */
+    { 0,    NULL }
 };
 
 /** Table of all unsupported options and help text to display when one
@@ -235,8 +219,6 @@ unsupportedOptTable[] = {
     { 'g',  NULL,      "use --generic instead" },
     { 'X',  NULL,      "use --xstack-loc instead" },
     { 'x',  NULL,      "use --xstack instead" },
-    { 'p',  NULL,      "use --stack-loc instead" },
-    { 'P',  NULL,      "use --stack-loc instead" },
     { 'i',  NULL,      "use --idata-loc instead" },
     { 'r',  NULL,      "use --xdata-loc instead" },
     { 's',  NULL,      "use --code-loc instead" },
@@ -253,7 +235,7 @@ static const char *_baseValues[] = {
   NULL
 };
 
-static const char *_preCmd = "{cpp} -Wall -lang-c++ -DSDCC=1 {cppextraopts} {fullsrcfilename} {cppoutfilename}";
+static const char *_preCmd = "{cpp} -nostdinc -Wall -lang-c++ -DSDCC=1 {cppextraopts} {fullsrcfilename} {cppoutfilename}";
 
 PORT *port;
 
@@ -277,12 +259,6 @@ static PORT *_ports[] =
 #if !OPT_DISABLE_PIC
   &pic_port,
 #endif
-#if !OPT_DISABLE_I186
-  &i186_port,
-#endif
-#if !OPT_DISABLE_TLCS900H
-  &tlcs900h_port,
-#endif
 #if !OPT_DISABLE_TININative
   &tininative_port,
 #endif
@@ -293,10 +269,9 @@ static PORT *_ports[] =
 
 #define NUM_PORTS (sizeof(_ports)/sizeof(_ports[0]))
 
-/**
-   remove me - TSD a hack to force sdcc to generate gpasm format .asm files.
- */
+#if !OPT_DISABLE_PIC
 extern void picglue ();
+#endif
 
 /** Sets the port to the one given by the command line option.
     @param    The name minus the option (eg 'mcs51')
@@ -327,11 +302,16 @@ _validatePorts (void)
     {
       if (_ports[i]->magic != PORT_MAGIC)
        {
+         /* Uncomment this line to debug which port is causing the problem
+          * (the target name is close to the beginning of the port struct 
+          * and probably can be accessed just fine). */
+         fprintf(stderr,"%s :",_ports[i]->target);
          wassertl (0, "Port definition structure is incomplete");
        }
     }
 }
 
+/* search through the command line options for the port */
 static void
 _findPort (int argc, char **argv)
 {
@@ -386,6 +366,21 @@ printVersionInfo ()
     );
 }
 
+static void
+printOptions(const OPTION *optionsTable)
+{
+  int i;
+  for (i = 0; optionsTable[i].shortOpt != 0 || optionsTable[i].longOpt != NULL; i++) 
+    {
+      fprintf(stdout, "  %c%c  %-20s  %s\n", 
+             optionsTable[i].shortOpt !=0 ? '-' : ' ',
+             optionsTable[i].shortOpt !=0 ? optionsTable[i].shortOpt : ' ',
+             optionsTable[i].longOpt != NULL ? optionsTable[i].longOpt : "",
+             optionsTable[i].help != NULL ? optionsTable[i].help : ""
+             );
+    }
+}
+
 /*-----------------------------------------------------------------*/
 /* printUsage - prints command line syntax         */
 /*-----------------------------------------------------------------*/
@@ -399,14 +394,17 @@ printUsage ()
              "Options :-\n"
              );
     
-    for (i = 0; i < LENGTH(optionsTable); i++) {
-        fprintf(stdout, "  %c%c  %-20s  %s\n", 
-                optionsTable[i].shortOpt !=0 ? '-' : ' ',
-                optionsTable[i].shortOpt !=0 ? optionsTable[i].shortOpt : ' ',
-                optionsTable[i].longOpt != NULL ? optionsTable[i].longOpt : "",
-                optionsTable[i].help != NULL ? optionsTable[i].help : ""
-                );
-    }
+    printOptions(optionsTable);
+
+    for (i = 0; i < NUM_PORTS; i++)
+      {
+       if (_ports[i]->poptions != NULL)
+         {
+           fprintf (stdout, "\nSpecial options for the %s port:\n", _ports[i]->target);
+           printOptions (_ports[i]->poptions);
+         }
+      }
+
     exit (0);
 }
 
@@ -599,6 +597,13 @@ _setModel (int model, const char *sz)
     werror (W_UNSUPPORTED_MODEL, sz, port->target);
 }
 
+static void
+_setProcessor (char *_processor)
+{
+  port->processor = _processor;
+  fprintf(stderr,"Processor: %s\n",_processor);
+}
+
 /** Gets the string argument to this option.  If the option is '--opt'
     then for input of '--optxyz' or '--opt xyz' returns xyz.
 */
@@ -682,6 +687,38 @@ tryHandleUnsupportedOpt(char **argv, int *pi)
     }
 }
 
+static bool
+scanOptionsTable(const OPTION *optionsTable, char shortOpt, const char *longOpt, char **argv, int *pi)
+{
+  int i;
+  for (i = 0; optionsTable[i].shortOpt != 0 || optionsTable[i].longOpt != NULL; i++)
+    {
+      if (optionsTable[i].shortOpt == shortOpt ||
+         (longOpt && optionsTable[i].longOpt && 
+          strcmp(optionsTable[i].longOpt, longOpt) == 0))
+       {
+
+         // If it is a flag then we can handle it here
+         if (optionsTable[i].pparameter != NULL) 
+           {
+             if (optionsTable[i].shortOpt == shortOpt)
+               {
+                 verifyShortOption(argv[*pi]);
+               }
+
+             (*optionsTable[i].pparameter)++;
+             return 1;
+           }
+         else {
+           // Not a flag.  Handled manually later.
+           return 0;
+         }
+       }
+    }
+  // Didn't find in the table
+  return 0;
+}
+
 static bool
 tryHandleSimpleOpt(char **argv, int *pi)
 {
@@ -689,7 +726,6 @@ tryHandleSimpleOpt(char **argv, int *pi)
         {
             const char *longOpt = "";
             char shortOpt = -1;
-            int i;
 
             if (argv[*pi][1] == '-') 
                 {
@@ -701,32 +737,19 @@ tryHandleSimpleOpt(char **argv, int *pi)
                     shortOpt = argv[*pi][1];
                 }
 
-            for (i = 0; i < LENGTH(optionsTable); i++) 
-              {
-                if (optionsTable[i].shortOpt == shortOpt ||
-                    (longOpt && optionsTable[i].longOpt && 
-                     strcmp(optionsTable[i].longOpt, longOpt) == 0))
-                  {
-
-                    // If it is a flag then we can handle it here
-                    if (optionsTable[i].pparameter != NULL) 
-                      {
-                        if (optionsTable[i].shortOpt == shortOpt)
-                          {
-                            verifyShortOption(argv[*pi]);
-                          }
-
-                        (*optionsTable[i].pparameter)++;
-                        return 1;
-                      }
-                    else {
-                      // Not a flag.  Handled manually later.
-                      return 0;
-                    }
-                  }
-              }
-            // Didn't find in the table
-            return 0;
+           if (scanOptionsTable(optionsTable, shortOpt, longOpt, argv, pi))
+             {
+               return 1;
+             }
+           else if (port && port->poptions &&
+                    scanOptionsTable(port->poptions, shortOpt, longOpt, argv, pi))
+             {
+               return 1;
+             }
+           else
+             {
+               return 0;
+             }
         }
     else 
         {
@@ -947,6 +970,11 @@ parseCmdLine (int argc, char **argv)
              _setPort (argv[i] + 2);
              break;
 
+           case 'p':
+             /* Used to select the processor in port */
+             _setProcessor (getStringArg("-p", argv, &i, argc));
+             break;
+
            case 'c':
               verifyShortOption(argv[i]);
 
@@ -1167,11 +1195,13 @@ linkEdit (char **envp)
        }
 #endif
 
-#if !OPT_DISABLE_XA51
+#if !OPT_DISABLE_XA51 
+#ifdef STD_XA51_LIB
       if (options.model == MODEL_PAGE0)
        {
          fprintf (lnkfile, "-l %s\n", STD_XA51_LIB);
        }
+#endif
 #endif
       fprintf (lnkfile, "-l %s\n", STD_LIB);
       fprintf (lnkfile, "-l %s\n", STD_INT_LIB);