a treat for those poor MS$ addicts
[fw/sdcc] / src / SDCCmain.c
index e7f76a53091c2f6300a2592de89241a20dd6b48c..6451241d567f997e34d90608470c7e7f8d902a4b 100644 (file)
@@ -134,13 +134,14 @@ optionsTable[] = {
     { 'S',  NULL,                   &noAssemble, "Assemble only" },
     { 'W',  NULL,                   NULL, "Pass through options to the assembler (a) or linker (l)" },
     { 'L',  NULL,                   NULL, "Add the next field to the library search path" },
-    { 0,    OPTION_LARGE_MODEL,     NULL, "Far functions, far data" },
-    { 0,    OPTION_MEDIUM_MODEL,    NULL, "Far functions, near data" },
-    { 0,    OPTION_SMALL_MODEL,     NULL, "Small model (default)" },
-    { 0,    OPTION_FLAT24_MODEL,    NULL, NULL },
+    { 'l',  NULL,                   NULL, "Include the given library in the link" },
+    { 0,    OPTION_LARGE_MODEL,     NULL, "external data space is used" },
+    { 0,    OPTION_MEDIUM_MODEL,    NULL, "not supported" },
+    { 0,    OPTION_SMALL_MODEL,     NULL, "internal data space is used (default)" },
+    { 0,    OPTION_FLAT24_MODEL,    NULL, "use the flat24 model for the ds390 (default)" },
     { 0,    "--stack-auto",         &options.stackAuto, "Stack automatic variables" },
-    { 0,    OPTION_STACK_8BIT,      NULL, NULL },
-    { 0,    "--stack-10bit",        &options.stack10bit, NULL },
+    { 0,    OPTION_STACK_8BIT,      NULL, "use the 8bit stack for the ds390 (not supported yet)" },
+    { 0,    "--stack-10bit",        &options.stack10bit, "use the 10bit stack for ds390 (default)" },
     { 0,    "--xstack",             &options.useXstack, "Use external stack" },
     { 0,    "--generic",            &options.genericPtr, "All unqualified ptrs converted to '_generic'" },
     { 0,    OPTION_NO_GCSE,         NULL, "Disable the GCSE optimisation" },
@@ -157,15 +158,15 @@ optionsTable[] = {
     { 0,    "--dumpregpack",        &options.dump_pack, NULL },
     { 0,    "--dumpregassign",      &options.dump_rassgn, NULL },
     { 0,    OPTION_DUMP_ALL,        NULL, "Dump the internal structure at all stages" },
-    { 0,    OPTION_XRAM_LOC,        NULL, NULL },
+    { 0,    OPTION_XRAM_LOC,        NULL, "<nnnn> External Ram start location" },
     { 0,    OPTION_IRAM_SIZE,       NULL, "<nnnn> Internal Ram size" },
     { 0,    OPTION_XSTACK_LOC,      NULL, "<nnnn> External Ram start location" },
     { 0,    OPTION_CODE_LOC,        NULL, "<nnnn> Code Segment Location" },
     { 0,    OPTION_STACK_LOC,       NULL, "<nnnn> Stack pointer initial value" },
     { 0,    OPTION_DATA_LOC,        NULL, "<nnnn> Direct data start location" },
     { 0,    OPTION_IDATA_LOC,       NULL, NULL },
-    { 0,    OPTION_PEEP_FILE,       NULL, NULL },
-    { 0,    OPTION_LIB_PATH,        NULL, NULL },
+    { 0,    OPTION_PEEP_FILE,       NULL, "<file> use this extra peep-hole file" },
+    { 0,    OPTION_LIB_PATH,        NULL, "<path> use this path to search for libraries" },
     { 0,    "--int-long-reent",     &options.intlong_rent, "Use reenterant calls on the int and long support functions" },
     { 0,    "--float-reent",        &options.float_rent, "Use reenterant calls on the floar support functions" },
     { 0,    OPTION_OUT_FMT_IHX,     NULL, NULL },
@@ -174,16 +175,17 @@ optionsTable[] = {
     { 0,    "--nooverlay",          &options.noOverlay, NULL },
     { 0,    "--main-return",        &options.mainreturn, "Issue a return after main()" },
     { 0,    "--no-peep",            &options.nopeep, "Disable the peephole assembly file optimisation" },
+    { 0,    "--no-reg-params",      &options.noRegParams, "On some ports, disable passing some parameters in registers" },
     { 0,    "--peep-asm",           &options.asmpeep, NULL },
     { 0,    "--debug",              &options.debug, "Enable debugging symbol output" },
     { 'v',  OPTION_VERSION,         NULL, "Display sdcc's version" },
-    { 0,    "--stack-after-data",   &options.stackOnData, NULL },
+    { 0,    "--stack-after-data",   &options.stackOnData, "initialize the stackpointer with the last byte use in DSEG" },
     { 'E',  "--preprocessonly",     &preProcOnly, "Preprocess only, do not compile" },
     { 0,    "--c1mode",             &options.c1mode, "Act in c1 mode.  The input is preprocessed code, the output is assembly code." },
     { 0,    "--help",               NULL, "Display this help" },
-    { 0,    OPTION_CALLEE_SAVES,    NULL, "Cause the called function to save registers insted of the caller" },
+    { 0,    OPTION_CALLEE_SAVES,    NULL, "<func[,func,...]> Cause the called function to save registers insted of the caller" },
     { 0,    "--nostdlib",           &options.nostdlib, "Do not include the standard library directory in the search path" },
-    { 0,    "--nostdinc",           &options.nostdinc, NULL },
+    { 0,    "--nostdinc",           &options.nostdinc, "Do not include the standard include directory in the search path" },
     { 0,    "--verbose",            &options.verbose, "Trace calls to the preprocessor, assembler, and linker" },
     { 0,    OPTION_LESS_PEDANTIC,   NULL, "Disable some of the more pedantic warnings" },
     { 0,    OPTION_SHORT_IS_8BITS,   NULL, "Make short 8bits (for old times sake)" }
@@ -288,8 +290,7 @@ _validatePorts (void)
     {
       if (_ports[i]->magic != PORT_MAGIC)
        {
-         printf ("Error: port %s is incomplete.\n", _ports[i]->target);
-         wassert (0);
+         wassertl (0, "Port definition structure is incomplete");
        }
     }
 }
@@ -328,27 +329,6 @@ printVersionInfo ()
     );
 }
 
-/*
-       "\t-m<proc>             -     Target processor <proc>.  Default %s\n"
-          "\t                           Try --version for supported values of <proc>\n"
-          "\t--model-large        -     Large Model\n"
-          "\t--model-small        -     Small Model (default)\n"
-          "\t--stack-auto         -     Stack automatic variables\n"
-          "\t--xstack             -     Use external stack\n"
-          "\t--xram-loc <nnnn>    -     External Ram start location\n"
-          "\t--xstack-loc <nnnn>  -     Xternal Stack Location\n"
-          "\t--code-loc <nnnn>    -     Code Segment Location\n"
-          "\t--stack-loc <nnnn>   -     Stack pointer initial value\n"
-          "\t--data-loc <nnnn>    -     Direct data start location\n"
-          "\t--idata-loc <nnnn>   -     Indirect data start location\n"
-          "\t--iram-size <nnnn>   -     Internal Ram size\n"
-          "\t--nojtbound          -     Don't generate boundary check for jump tables\n"
-          "\t--generic            -     All unqualified ptrs converted to '_generic'\n"
-          "PreProcessor Options :-\n"
-          "\t-Dmacro   - Define Macro\n"
-          "\t-Ipath    - Include \"*.h\" path\n"
-      "Note: this is NOT a complete list of options see docs for details\n",
-*/
 /*-----------------------------------------------------------------*/
 /* printUsage - prints command line syntax         */
 /*-----------------------------------------------------------------*/
@@ -381,7 +361,7 @@ parseWithComma (char **dest, char *src)
 {
   int i = 0;
 
-  strtok (src, "\n \t");
+  strtok (src, "\r\n \t");
   /* skip the initial white spaces */
   while (isspace (*src))
     src++;
@@ -426,7 +406,7 @@ setDefaultOptions ()
   options.nostdlib = 0;
   options.nostdinc = 0;
   options.verbose = 0;
-  options.shortis8bits = 1;
+  options.shortis8bits = 0;
 
   options.stack10bit=0;
 
@@ -574,13 +554,25 @@ _setModel (int model, const char *sz)
     then for input of '--optxyz' or '--opt xyz' returns xyz.
 */
 static char *
-getStringArg(const char *szStart, char **argv, int *pi)
+getStringArg(const char *szStart, char **argv, int *pi, int argc)
 {
-    if (argv[*pi][strlen(szStart)]) {
-        return &argv[*pi][strlen(szStart)];
+  if (argv[*pi][strlen(szStart)]) 
+    {
+      return &argv[*pi][strlen(szStart)];
     }
-    else {
-        return argv[++(*pi)];
+  else 
+    {
+      ++(*pi);
+      if (*pi >= argc) 
+        {
+          werror (E_ARGUMENT_MISSING, szStart);
+          /* Die here rather than checking for errors later. */
+          exit(-1);
+        }
+      else 
+        {
+          return argv[*pi];
+        }
     }
 }
 
@@ -588,9 +580,9 @@ getStringArg(const char *szStart, char **argv, int *pi)
     getStringArg. 
 */
 static int
-getIntArg(const char *szStart, char **argv, int *pi)
+getIntArg(const char *szStart, char **argv, int *pi, int argc)
 {
-    return (int)floatFromVal(constVal(getStringArg(szStart, argv, pi)));
+    return (int)floatFromVal(constVal(getStringArg(szStart, argv, pi, argc)));
 }
 
 static bool
@@ -761,13 +753,13 @@ parseCmdLine (int argc, char **argv)
 
          if (strcmp (argv[i], OPTION_PEEP_FILE) == 0)
            {
-                options.peep_file = getStringArg(OPTION_PEEP_FILE, argv, &i);
+                options.peep_file = getStringArg(OPTION_PEEP_FILE, argv, &i, argc);
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_LIB_PATH) == 0)
             {
-               libPaths[nlibPaths++] = getStringArg(OPTION_LIB_PATH, argv, &i);
+               libPaths[nlibPaths++] = getStringArg(OPTION_LIB_PATH, argv, &i, argc);
                 continue;
            }
 
@@ -780,49 +772,49 @@ parseCmdLine (int argc, char **argv)
 
          if (strcmp (argv[i], OPTION_CALLEE_SAVES) == 0)
            {
-                parseWithComma (options.calleeSaves, getStringArg(OPTION_CALLEE_SAVES, argv, &i));
+                parseWithComma (options.calleeSaves, getStringArg(OPTION_CALLEE_SAVES, argv, &i, argc));
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_XSTACK_LOC) == 0)
            {
-                options.xstack_loc = getIntArg(OPTION_XSTACK_LOC, argv, &i);
+                options.xstack_loc = getIntArg(OPTION_XSTACK_LOC, argv, &i, argc);
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_STACK_LOC) == 0)
            {
-                options.stack_loc = getIntArg(OPTION_STACK_LOC, argv, &i);
+                options.stack_loc = getIntArg(OPTION_STACK_LOC, argv, &i, argc);
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_XRAM_LOC) == 0)
            {
-                options.xdata_loc = getIntArg(OPTION_XRAM_LOC, argv, &i);
+                options.xdata_loc = getIntArg(OPTION_XRAM_LOC, argv, &i, argc);
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_IRAM_SIZE) == 0)
            {
-                options.iram_size = getIntArg(OPTION_IRAM_SIZE, argv, &i);
+                options.iram_size = getIntArg(OPTION_IRAM_SIZE, argv, &i, argc);
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_DATA_LOC) == 0)
            {
-                options.data_loc = getIntArg(OPTION_DATA_LOC, argv, &i);
+                options.data_loc = getIntArg(OPTION_DATA_LOC, argv, &i, argc);
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_IDATA_LOC) == 0)
            {
-                options.idata_loc = getIntArg(OPTION_IDATA_LOC, argv, &i);
+                options.idata_loc = getIntArg(OPTION_IDATA_LOC, argv, &i, argc);
                 continue;
            }
 
          if (strcmp (argv[i], OPTION_CODE_LOC) == 0)
            {
-                options.code_loc = getIntArg(OPTION_CODE_LOC, argv, &i);
+                options.code_loc = getIntArg(OPTION_CODE_LOC, argv, &i, argc);
                 continue;
            }
 
@@ -845,15 +837,16 @@ parseCmdLine (int argc, char **argv)
            }
 
           if (strcmp (argv[i], OPTION_LESS_PEDANTIC) == 0) 
-              {
-                  setErrorLogLevel(ERROR_LEVEL_WARNING);
-                  continue;
-              }
-
-         if (strcmp (&argv[i][1], OPTION_SHORT_IS_8BITS) == 0) {
-           options.shortis8bits=1;
-           continue;
-         }
+            {
+              setErrorLogLevel(ERROR_LEVEL_WARNING);
+              continue;
+            }
+
+         if (strcmp (&argv[i][1], OPTION_SHORT_IS_8BITS) == 0) 
+            {
+              options.shortis8bits=1;
+              continue;
+            }
           
          if (!port->parseOption (&argc, argv, &i))
            {
@@ -885,21 +878,25 @@ parseCmdLine (int argc, char **argv)
              break;
 
            case 'L':
-                libPaths[nlibPaths++] = getStringArg("-L", argv, &i);
+                libPaths[nlibPaths++] = getStringArg("-L", argv, &i, argc);
+                break;
+
+            case 'l':
+                libFiles[nlibFiles++] = getStringArg("-l", argv, &i, argc);
                 break;
 
            case 'W':
              /* linker options */
              if (argv[i][2] == 'l')
                {
-                    parseWithComma(linkOptions, getStringArg("-Wl", argv, &i));
+                    parseWithComma(linkOptions, getStringArg("-Wl", argv, &i, argc));
                }
              else
                {
                  /* assembler options */
                  if (argv[i][2] == 'a')
                    {
-                       parseWithComma ((char **) asmOptions, getStringArg("-Wa", argv, &i));
+                       parseWithComma ((char **) asmOptions, getStringArg("-Wa", argv, &i, argc));
                    }
                  else
                    {