X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=rmac.c;h=9f52e0b49f94856e1434c7d1006ab90ede01b7df;hp=5946105b03b0b68989ec8a19a2979a76aa6071db;hb=HEAD;hpb=3f937a2ab53c5fa20f5468e59c278da9d8c54b02 diff --git a/rmac.c b/rmac.c index 5946105..17715f7 100644 --- a/rmac.c +++ b/rmac.c @@ -31,6 +31,7 @@ int verb_flag; // Be verbose about what's going on int m6502; // 1, assembling 6502 code int glob_flag; // Assume undefined symbols are global int lsym_flag; // Include local symbols in object file (ALWAYS true) +int dsym_flag; // Gen debug syms (Requires obj_format = BSD) int optim_warn_flag; // Warn about possible short branches int prg_flag; // !=0, produce .PRG executable (2=symbols) int prg_extend; // !=0, output extended .PRG symbols @@ -61,6 +62,7 @@ int activefpu = FPU_NONE; // Active FPU (none by default) int org68k_active = 0; // .org switch for 68k (only with RAW output format) uint32_t org68k_address; // .org for 68k int correctMathRules; // 1, use C operator precedence in expressions +uint32_t used_architectures; // Bitmask that records exactly which architectures were used during assembly // // Convert a string to uppercase @@ -162,11 +164,13 @@ void DisplayHelp(void) " -f[format] Output object file format\n" " a: ALCYON\n" " b: BSD (use this for Jaguar)\n" + " c: PRG (C64)\n" " e: ELF\n" " p: P56 (use this for DSP56001 only)\n" " l: LOD (use this for DSP56001 only)\n" " x: com/exe/xex (Atari 800)\n" " r: absolute address\n" + " -g Output source level debug information (BSD object only)\n" " -i[path] Directory to search for include files\n" " -l[filename] Create an output listing file\n" " -l*[filename] Create an output listing file without pagination\n" @@ -290,6 +294,42 @@ int ParseOptimization(char * optstring) return OK; } +static void ProcessFile(int fd, char *fname) +{ + char *dbgname = fname; + + if (NULL == fname) + { + fname = defname; // Kludge first filename + dbgname = "(stdin)"; + } + + // First file operations: + if (firstfname == NULL) + { + // Record first filename. + firstfname = fname; + + // Validate option compatibility + if (dsym_flag) + { + if (obj_format != BSD) + { + printf("-g: debug information only supported with BSD object file format\n"); + dsym_flag = 0; + errcnt++; + } + else + { + GenMainFileSym(dbgname); + } + } + } + + include(fd, dbgname); + Assemble(); +} + extern int reg68base[53]; extern int reg68tab[222]; extern int reg68check[222]; @@ -326,6 +366,7 @@ int Process(int argc, char ** argv) rdsp = 0; // Initialize DSP assembly flag robjproc = 0; // Initialize OP assembly flag lsym_flag = 1; // Include local symbols in object file + dsym_flag = 0; // No debug sym generation by default orgactive = 0; // Not in RISC org section orgwarning = 0; // No ORG warning issued segpadsize = 2; // Initialize segment padding size @@ -337,6 +378,7 @@ int Process(int argc, char ** argv) regcheck = reg68check; // Idem regaccept = reg68accept; // Idem correctMathRules = 0; // respect operator precedence + used_architectures = 0; // Initialise used architectures bitfield // Initialize modules InitSymbolTable(); // Symbol table InitTokenizer(); // Tokenizer @@ -404,6 +446,10 @@ int Process(int argc, char ** argv) case 'B': obj_format = BSD; break; + case 'c': + case 'C': + obj_format = C64PRG; + break; case 'e': // -fe = ELF case 'E': obj_format = ELF; @@ -432,7 +478,7 @@ int Process(int argc, char ** argv) break; case 'g': // Debugging flag case 'G': - printf("Debugging flag (-g) not yet implemented\n"); + dsym_flag = 1; break; case 'i': // Set directory search path case 'I': @@ -607,11 +653,7 @@ int Process(int argc, char ** argv) break; case EOS: // Input is stdin - if (firstfname == NULL) // Kludge first filename - firstfname = defname; - - include(0, "(stdin)"); - Assemble(); + ProcessFile(0, NULL); break; case 'h': // Display command line usage case 'H': @@ -646,10 +688,6 @@ int Process(int argc, char ** argv) } else { - // Record first filename. - if (firstfname == NULL) - firstfname = argv[argno]; - strcpy(fnbuf, argv[argno]); fext(fnbuf, ".s", 0); fd = open(fnbuf, 0); @@ -661,8 +699,7 @@ int Process(int argc, char ** argv) continue; } - include(fd, fnbuf); - Assemble(); + ProcessFile(fd, fnbuf); } } @@ -721,7 +758,9 @@ int Process(int argc, char ** argv) if (firstfname == NULL) firstfname = defname; - strcpy(fnbuf, firstfname); + // It's the size of fnbuf minus 5 because of the possible 4 char suffix + // + trailing null (added by fext()). + strncpy(fnbuf, firstfname, sizeof(fnbuf) - 5); fext(fnbuf, (prg_flag ? ".prg" : ".o"), 1); objfname = fnbuf; }