X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=rmac.c;h=45cd1d8f0532ff69347de1979fa1e6ed3da18f69;hp=0683739847ce7172b1562068545f393a5b969266;hb=0fd4b86c9899d254d9aea0660e5046c4234cfd42;hpb=01ad052f31fbf2660fec864060aca90c7761a25a diff --git a/rmac.c b/rmac.c index 0683739..45cd1d8 100644 --- 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_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" @@ -142,8 +146,10 @@ void DisplayHelp(void) " d: double phrase (16 bytes)\n" " q: quad phrase (32 bytes)\n" " -s Warn about possible short branches\n" + " and applied optimisations\n" " -u Force referenced and undefined symbols global\n" " -v Set verbose mode\n" + " -x Turn on debugging mode\n" " -y[pagelen] Set page line length (default: 61)\n" "\n", cmdlnexec); } @@ -165,6 +171,42 @@ 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 // @@ -401,6 +443,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. @@ -526,6 +579,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