]> Shamusworld >> Repos - rmac/blobdiff - rmac.c
Version bump. :-)
[rmac] / rmac.c
diff --git a/rmac.c b/rmac.c
index 910cb88d5260535406cef0dd397282630b58d372..cde6e123784b972cf676b38a04d208b34f7e9a39 100644 (file)
--- a/rmac.c
+++ b/rmac.c
@@ -45,7 +45,7 @@ char * firstfname;                            // First source filename
 char * cmdlnexec;                              // Executable name, pointer to ARGV[0]
 char * searchpath;                             // Search path for include files 
 char defname[] = "noname.o";   // Default output filename
-int optim_flag;                                        // Optimise all the things!
+int optim_flags[OPT_COUNT];    // Specific optimisations on/off matrix
 
 //
 // Manipulate file extension.
@@ -132,6 +132,10 @@ void DisplayHelp(void)
                "  -l[filename]      Create an output listing file\n"
                "  -n                Don't do things behind your back in RISC assembler\n"
                "  -o file           Output file name\n"
+               "  +o[value]         Turn a specific optimisation on\n"
+               "  ~o[value]         Turn a specific optimisation off\n"
+               "  +oall             Turn all optimisations on\n"
+               "  ~oall             Turn all optimisations off\n"
                "  -p                Create an ST .prg (without symbols)\n"
                "  -ps               Create an ST .prg (with symbols)\n"
                "                    Forces -fa\n"
@@ -144,8 +148,8 @@ void DisplayHelp(void)
                "  -s                Warn about possible short branches\n"
                "                    and applied optimisations\n"
                "  -u                Force referenced and undefined symbols global\n"
-               "  -w                Turn off optimisations done automatically\n"
                "  -v                Set verbose mode\n"
+               "  -x                Turn on debugging mode\n"
                "  -y[pagelen]       Set page line length (default: 61)\n"
                "\n", cmdlnexec);
 }
@@ -167,6 +171,41 @@ void DisplayVersion(void)
 }
 
 
+//
+// Parse optimisation options
+//
+int ParseOptimization(char * optstring)
+{
+       int onoff = 0;
+
+       if (*optstring == '+')
+               onoff = 1;
+       else if (*optstring != '~')
+               return ERROR;
+
+       if ((optstring[2] == 'a' || optstring[2] == 'A')
+               && (optstring[3] == 'l' || optstring[3] == 'L')
+               && (optstring[4] == 'l' || optstring[4] == 'L'))
+       {
+               memset(optim_flags, onoff, OPT_COUNT * sizeof(int));
+               return OK;
+       }
+       else if (optstring[1] == 'o' || optstring[1] == 'O') // Turn on specific optimisation
+       {
+               int opt_no = atoi(&optstring[2]);
+
+               if ((opt_no >= 0) && (opt_no < OPT_COUNT))
+                       optim_flags[opt_no] = onoff;
+               else
+                       return ERROR;
+       }
+       else
+       {
+               return ERROR;
+       }
+}
+
+
 // 
 // Process command line arguments and do an assembly
 //
@@ -202,7 +241,6 @@ int Process(int argc, char ** argv)
        orgactive = 0;                                  // Not in RISC org section
        orgwarning = 0;                                 // No ORG warning issued
        segpadsize = 2;                                 // Initialise segment padding size
-       optim_flag = 1;                                 // Automatically optimise
 
        // Initialise modules
        InitSymbolTable();                              // Symbol table
@@ -360,10 +398,6 @@ int Process(int argc, char ** argv)
                                        DisplayVersion();
 
                                break;
-                       case 'w':
-                       case 'W':
-                               optim_flag=0;
-                               break;
                        case 'x':                               // Turn on debugging
                        case 'X':
                                debug = 1;
@@ -408,6 +442,17 @@ int Process(int argc, char ** argv)
                                break;
                        }
                }
+               else if (*argv[argno] == '+' || *argv[argno] == '~')
+               {
+                       if (ParseOptimization(argv[argno]) != OK)
+                       {
+                               DisplayVersion();
+                               printf("Unknown switch: %s\n\n", argv[argno]);
+                               DisplayHelp();
+                               errcnt++;
+                               break;
+                       }
+               }
                else
                {
                        // Record first filename.
@@ -533,6 +578,14 @@ int main(int argc, char ** argv)
 {
        perm_verb_flag = 0;                             // Clobber "permanent" verbose flag
        legacy_flag = 1;                                // Default is legacy mode on (:-P)
+
+       // Set legacy optimisation flags to on
+       // and everything else to off
+       memset(optim_flags, 0, OPT_COUNT * sizeof(int));
+       optim_flags[OPT_ABS_SHORT] = 
+               optim_flags[OPT_MOVEL_MOVEQ] =
+               optim_flags[OPT_BSR_BCC_S] = 1;  
+
        cmdlnexec = argv[0];                    // Obtain executable name
 
        endian = GetEndianess();                // Get processor endianess