X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCmain.c;h=c01f17582860e5948e921eadb609f582077a6d41;hb=3456dfdd9cd3a27e8b59645bf8f4bfb01515481d;hp=6bf1381fe25bd110a15fcd49ef6e71e59f7874a8;hpb=357db11aebf878e4304f199d253fb8646d153eb3;p=fw%2Fsdcc diff --git a/src/SDCCmain.c b/src/SDCCmain.c index 6bf1381f..c01f1758 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -30,6 +30,7 @@ #include "MySystem.h" #include "SDCCmacro.h" #include "SDCCutil.h" +#include "SDCCargs.h" #if NATIVE_WIN32 #include @@ -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," 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') @@ -319,6 +294,15 @@ _setPort (const char *name) exit (1); } +/* Override the default processor with the one specified + * on the command line */ +static void +_setProcessor (char *_processor) +{ + port->processor = _processor; + fprintf(stderr,"Processor: %s\n",_processor); +} + static void _validatePorts (void) { @@ -327,11 +311,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) { @@ -350,6 +339,23 @@ _findPort (int argc, char **argv) port = _ports[0]; } +/* search through the command line options for the processor */ +static void +_findProcessor (int argc, char **argv) +{ + while (argc--) + { + if (!strncmp (*argv, "-p", 2)) + { + _setProcessor (*argv + 2); + return; + } + argv++; + } + + /* no error if processor was not specified. */ +} + /*-----------------------------------------------------------------*/ /* printVersionInfo - prints the version info */ /*-----------------------------------------------------------------*/ @@ -386,6 +392,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 +420,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); } @@ -682,6 +706,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 +745,6 @@ tryHandleSimpleOpt(char **argv, int *pi) { const char *longOpt = ""; char shortOpt = -1; - int i; if (argv[*pi][1] == '-') { @@ -701,32 +756,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 { @@ -943,8 +985,12 @@ parseCmdLine (int argc, char **argv) break; case 'm': - /* Used to select the port */ - _setPort (argv[i] + 2); + /* Used to select the port. But this has already been done. */ + break; + + case 'p': + /* Used to select the processor in port. But this has + * already been done. */ break; case 'c': @@ -1167,11 +1213,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); @@ -1512,7 +1560,14 @@ main (int argc, char **argv, char **envp) exit (1); } + /* Before parsing the command line options, do a + * search for the port and processor and initialize + * them if they're found. (We can't gurantee that these + * will be the first options specified). + */ + _findPort (argc, argv); + #ifdef JAMIN_DS390 if (strcmp(port->target, "mcs51") == 0) { printf("DS390 jammed in A\n"); @@ -1520,6 +1575,9 @@ main (int argc, char **argv, char **envp) ds390_jammed = 1; } #endif + + _findProcessor (argc, argv); + /* Initalise the port. */ if (port->init) port->init ();