what you give them. Help stamp out software-hoarding!
-------------------------------------------------------------------------*/
+#include <signal.h>
#include "common.h"
#include <ctype.h>
#include "newalloc.h"
#if NATIVE_WIN32
#include <process.h>
-#else
-#include "spawn.h"
#endif
#if !defined(__BORLANDC__) && !defined(_MSC_VER)
FILE *srcFile; /* source file */
FILE *cdbFile = NULL; /* debugger information output file */
-char *fullSrcFileName; /* full name for the source file */
-char *srcFileName; /* source file name with the .c stripped */
-char *moduleName; /* module name is srcFilename stripped of any path */
+char *fullSrcFileName; /* full name for the source file; */
+ /* can be NULL while c1mode or linking without compiling */
+char *fullDstFileName; /* full name for the output file; */
+ /* only given by -o, otherwise NULL */
+size_t fullDstFileNameLen; /* size of previous string. */
+char *dstFileName; /* destination file name without extension */
+char *dstPath = ""; /* path for the output files; */
+ /* "" is equivalent with cwd */
+char *moduleName; /* module name is source file without path and extension */
+ /* can be NULL while linking without compiling */
const char *preArgv[128]; /* pre-processor arguments */
int currRegBank = 0;
+int RegBankUsed[4]={1, 0, 0, 0}; /*JCF: Reg Bank 0 used by default*/
struct optimize optimize;
struct options options;
char *VersionString = SDCC_VERSION_STR;
int nlibPaths = 0;
char *relFiles[128];
int nrelFiles = 0;
-bool verboseExec = FALSE;
-char *preOutName;
+static char *preOutName;
/* uncomment JAMIN_DS390 to always override and use ds390 port
for mcs51 work. This is temporary, for compatibility testing. */
// Globally accessible scratch buffer for file names.
char scratchFileName[PATH_MAX];
-char buffer[PATH_MAX];
+char buffer[PATH_MAX * 2];
// In MSC VC6 default search path for exe's to path for this
#define OPTION_DATA_LOC "--data-loc"
#define OPTION_CODE_LOC "--code-loc"
#define OPTION_IDATA_LOC "--idata-loc"
+#define OPTION_NO_LABEL_OPT "--nolabelopt"
#define OPTION_NO_LOOP_INV "--noinvariant"
#define OPTION_NO_LOOP_IND "--noinduction"
#define OPTION_LESS_PEDANTIC "--lesspedantic"
#define OPTION_NO_GCSE "--nogcse"
#define OPTION_SHORT_IS_8BITS "--short-is-8bits"
#define OPTION_TINI_LIBID "--tini-libid"
+#define OPTION_NO_XINIT_OPT "--no-xinit-opt"
+#define OPTION_XRAM_SIZE "--xram-size"
+#define OPTION_CODE_SIZE "--code-size"
+#define OPTION_NO_CCODE_IN_ASM "--no-c-code-in-asm"
+#define OPTION_ICODE_IN_ASM "--i-code-in-asm"
-static const 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" },
{ 'U', NULL, NULL, NULL },
{ 'C', NULL, NULL, "Preprocessor option" },
{ 'M', NULL, NULL, "Preprocessor option" },
- { 'V', NULL, &verboseExec, "Execute verbosely. Show sub commands as they are run" },
+ { 'V', NULL, &options.verboseExec, "Execute verbosely. Show sub commands as they are run" },
{ 'S', NULL, &noAssemble, "Compile only; do not assemble or link" },
{ 'W', NULL, NULL, "Pass through options to the pre-processor (p), assembler (a) or linker (l)" },
{ 'L', NULL, NULL, "Add the next field to the library search path" },
{ 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" },
+ { 0, OPTION_NO_LABEL_OPT, NULL, "Disable label optimisation" },
{ 0, OPTION_NO_LOOP_INV, NULL, "Disable optimisation of invariants" },
{ 0, OPTION_NO_LOOP_IND, NULL, NULL },
{ 0, "--nojtbound", &optimize.noJTabBoundary, "Don't generate boundary check for jump tables" },
{ 0, "--noloopreverse", &optimize.noLoopReverse, "Disable the loop reverse optimisation" },
{ 'c', "--compile-only", &options.cc_only, "Compile and assemble, but do not link" },
+ { 'o', NULL, NULL, "Place the output into the given path resp. file" },
{ 0, "--dumpraw", &options.dump_raw, "Dump the internal structure after the initial parse" },
{ 0, "--dumpgcse", &options.dump_gcse, NULL },
{ 0, "--dumploop", &options.dump_loop, NULL },
{ 0, "--dumptree", &options.dump_tree, "dump front-end AST before generating iCode" },
{ 0, OPTION_DUMP_ALL, NULL, "Dump the internal structure at all stages" },
{ 0, OPTION_XRAM_LOC, NULL, "<nnnn> External Ram start location" },
+ { 0, OPTION_XRAM_SIZE, NULL, "<nnnn> External Ram size" },
{ 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_CODE_SIZE, NULL, "<nnnn> Code Segment size" },
{ 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, "--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, "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, "--c1mode", &options.c1mode, "Act in c1 mode. The standard input is preprocessed code, the output is assembly code." },
{ 0, "--help", NULL, "Display this help" },
{ 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, "--tini-libid", NULL,"<nnnn> 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, OPTION_NO_XINIT_OPT, &options.noXinitOpt, "don't memcpy initialized xram from code"},
+ { 0, OPTION_NO_CCODE_IN_ASM, &options.noCcodeInAsm, "don't include c-code as comments in the asm file"},
+ { 0, OPTION_ICODE_IN_ASM, &options.iCodeInAsm, "include i-code as comments in the asm file"},
/* End of options */
{ 0, NULL }
};
static const UNSUPPORTEDOPT
unsupportedOptTable[] = {
- { 'a', NULL, "use --stack-auto instead." },
- { 'g', NULL, "use --generic instead" },
{ 'X', NULL, "use --xstack-loc instead" },
{ 'x', NULL, "use --xstack instead" },
{ 'i', NULL, "use --idata-loc instead" },
NULL
};
-static const char *_preCmd = "{cpp} -nostdinc -Wall -lang-c++ -DSDCC=1 {cppextraopts} {fullsrcfilename} {cppoutfilename}";
+static const char *_preCmd = "{cpp} -nostdinc -Wall -std=c99 -DSDCC=1 {cppextraopts} {fullsrcfilename} {cppoutfilename}";
PORT *port;
" (" __DATE__ ")"
#ifdef __CYGWIN__
" (CYGWIN)\n"
-#else
-#ifdef __DJGPP__
+#elif defined __MINGW32__
+ " (MINGW32) \n"
+#elif defined __DJGPP__
" (DJGPP) \n"
-#else
-#if defined(_MSC_VER)
- " (WIN32) \n"
+#elif defined(_MSC_VER)
+ " (MSVC) \n"
+#elif defined(__BORLANDC__)
+ " (BORLANDC) \n"
#else
" (UNIX) \n"
-#endif
-#endif
#endif
,VersionString
"Usage : sdcc [options] filename\n"
"Options :-\n"
);
-
+
printOptions(optionsTable);
for (i = 0; i < NUM_PORTS; i++)
options.stack_loc = 0; /* stack pointer initialised to 0 */
options.xstack_loc = 0; /* xternal stack starts at 0 */
options.code_loc = 0; /* code starts at 0 */
- options.data_loc = 0x0030; /* data starts at 0x0030 */
+ options.data_loc = 0; /* JCF: By default let the linker locate data */
options.xdata_loc = 0;
options.idata_loc = 0x80;
- options.genericPtr = 1; /* default on */
options.nopeep = 0;
options.model = port->general.default_model;
options.nostdlib = 0;
}
/* otherwise depending on the file type */
- if (strcmp (fext, ".c") == 0 || strcmp (fext, ".C") == 0 || options.c1mode)
+ if (strcmp (fext, ".c") == 0 || strcmp (fext, ".C") == 0)
{
/* source file name : not if we already have a
source file */
- if (srcFileName)
+ if (fullSrcFileName)
{
werror (W_TOO_MANY_SRC, s);
return;
}
/* the only source file */
- if (!(srcFile = fopen ((fullSrcFileName = s), "r")))
+ fullSrcFileName = s;
+ if (!(srcFile = fopen (fullSrcFileName, "r")))
{
werror (E_FILE_OPEN_ERR, s);
exit (1);
}
/* copy the file name into the buffer */
- strcpy (buffer, s);
+ strncpyz (buffer, s, sizeof(buffer));
/* get rid of the "."-extension */
/* is there a dot at all? */
- if (strchr (buffer, '.') &&
+ if (strrchr (buffer, '.') &&
/* is the dot in the filename, not in the path? */
- (strrchr (buffer, '/' ) < strrchr (buffer, '.') ||
- strrchr (buffer, '\\') < strrchr (buffer, '.')))
+ (strrchr (buffer, DIR_SEPARATOR_CHAR) < strrchr (buffer, '.')))
+ {
*strrchr (buffer, '.') = '\0';
-
- srcFileName = Safe_alloc ( strlen (buffer) + 1);
- strcpy (srcFileName, buffer);
+ }
/* get rid of any path information
- for the module name; do this by going
- backwards till we get to either '/' or '\' or ':'
- or start of buffer */
+ for the module name; */
fext = buffer + strlen (buffer);
+#if NATIVE_WIN32
+ /* do this by going backwards till we
+ get '\' or ':' or start of buffer */
while (fext != buffer &&
- *(fext - 1) != '\\' &&
- *(fext - 1) != '/' &&
+ *(fext - 1) != DIR_SEPARATOR_CHAR &&
*(fext - 1) != ':')
+ {
fext--;
- moduleName = Safe_alloc ( strlen (fext) + 1);
- strcpy (moduleName, fext);
-
+ }
+#else
+ /* do this by going backwards till we
+ get '/' or start of buffer */
+ while (fext != buffer &&
+ *(fext - 1) != DIR_SEPARATOR_CHAR)
+ {
+ fext--;
+ }
+#endif
+ moduleName = Safe_strdup ( fext );
return;
}
}
-static void
-_processC1Arg (char *s)
-{
- if (srcFileName)
- {
- if (options.out_name)
- {
- werror (W_TOO_MANY_SRC, s);
- return;
- }
- options.out_name = Safe_strdup (s);
- }
- else
- {
- processFile (s);
- }
-}
-
static void
_setModel (int model, const char *sz)
{
(longOpt && unsupportedOptTable[i].longOpt && !strcmp(unsupportedOptTable[i].longOpt, longOpt))) {
// Found an unsupported opt.
char buffer[100];
- sprintf(buffer, "%s%c%c", longOpt ? longOpt : "", shortOpt ? '-' : ' ', shortOpt ? shortOpt : ' ');
+ SNPRINTF(buffer, sizeof(buffer),
+ "%s%c%c",
+ longOpt ? longOpt : "",
+ shortOpt ? '-' : ' ', shortOpt ? shortOpt : ' ');
werror (W_UNSUPP_OPTION, buffer, unsupportedOptTable[i].message);
return 1;
}
/*-----------------------------------------------------------------*/
/* parseCmdLine - parses the command line and sets the options */
/*-----------------------------------------------------------------*/
-int
+static int
parseCmdLine (int argc, char **argv)
{
int i;
continue;
}
+ if (strcmp (argv[i], OPTION_XRAM_SIZE) == 0)
+ {
+ options.xram_size = getIntArg(OPTION_IRAM_SIZE, argv, &i, argc);
+ options.xram_size_set = TRUE;
+ continue;
+ }
+
+ if (strcmp (argv[i], OPTION_CODE_SIZE) == 0)
+ {
+ options.code_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, argc);
continue;
}
+ if (strcmp (argv[i], OPTION_NO_LABEL_OPT) == 0)
+ {
+ optimize.label4 = 0;
+ continue;
+ }
+
if (strcmp (argv[i], OPTION_NO_LOOP_IND) == 0)
{
optimize.loopInduction = 0;
case 'l':
libFiles[nlibFiles++] = getStringArg("-l", argv, &i, argc);
break;
+
+ case 'o':
+ {
+ char *p;
+
+ /* copy the file name into the buffer */
+ strncpyz(buffer, getStringArg("-o", argv, &i, argc),
+ sizeof(buffer));
+ /* point to last character */
+ p = buffer + strlen (buffer) - 1;
+ if (*p == DIR_SEPARATOR_CHAR)
+ {
+ /* only output path specified */
+ dstPath = Safe_strdup (buffer);
+ fullDstFileName = NULL;
+ }
+ else
+ {
+ fullDstFileName = Safe_strdup (buffer);
+ fullDstFileNameLen = strlen(fullDstFileName) + 1;
+
+ /* get rid of the "."-extension */
+
+ /* is there a dot at all? */
+ if (strrchr (buffer, '.') &&
+ /* is the dot in the filename, not in the path? */
+ (strrchr (buffer, DIR_SEPARATOR_CHAR) < strrchr (buffer, '.')))
+ *strrchr (buffer, '.') = '\0';
+
+ dstFileName = Safe_strdup (buffer);
+
+ /* strip module name to get path */
+ p = strrchr (buffer, DIR_SEPARATOR_CHAR);
+ if (p)
+ {
+ /* path with trailing / */
+ p[1] = '\0';
+ dstPath = Safe_strdup (buffer);
+ }
+ }
+ break;
+ }
case 'W':
/* pre-processer options */
if (argv[i][2] == ' ' || argv[i][2] == '\0')
{
i++;
- if (i >= argc)
+ if (i >= argc)
{
/* No argument. */
werror(E_ARGUMENT_MISSING, argv[i-1]);
break;
}
- else
+ else
{
rest = argv[i];
}
if (sOpt == 'Y')
sOpt = 'I';
- sprintf (buffer, "-%c%s", sOpt, rest);
+ SNPRINTF (buffer, sizeof(buffer), "-%c%s", sOpt, rest);
addToList (preArgv, buffer);
}
break;
if (!port->parseOption (&argc, argv, &i))
{
- /* no option must be a filename */
- if (options.c1mode)
- _processC1Arg (argv[i]);
- else
- processFile (argv[i]);
+ /* no option must be a filename */
+ if (options.c1mode)
+ {
+ werror (W_NO_FILE_ARG_IN_C1, argv[i]);
+ }
+ else
+ {
+ processFile (argv[i]);
+ }
+ }
+ }
+
+ /* some sanity checks in c1 mode */
+ if (options.c1mode)
+ {
+ int i;
+
+ if (fullSrcFileName)
+ {
+ fclose (srcFile);
+ werror (W_NO_FILE_ARG_IN_C1, fullSrcFileName);
}
+ fullSrcFileName = NULL;
+ for (i = 0; i < nrelFiles; ++i)
+ {
+ werror (W_NO_FILE_ARG_IN_C1, relFiles[i]);
+ }
+ for (i = 0; i < nlibFiles; ++i)
+ {
+ werror (W_NO_FILE_ARG_IN_C1, libFiles[i]);
+ }
+ nrelFiles = nlibFiles = 0;
+ if (options.cc_only || noAssemble || preProcOnly)
+ {
+ werror (W_ILLEGAL_OPT_COMBINATION);
+ }
+ options.cc_only = noAssemble = preProcOnly = 0;
+ if (!dstFileName)
+ {
+ werror (E_NEED_OPT_O_IN_C1);
+ exit (1);
+ }
+ }
+ /* if no dstFileName given with -o, we've to find one: */
+ if (!dstFileName)
+ {
+ /* use the modulename from the C-source */
+ if (fullSrcFileName)
+ {
+ size_t bufSize = strlen (dstPath) + strlen (moduleName) + 1;
+
+ dstFileName = Safe_alloc (bufSize);
+ strncpyz (dstFileName, dstPath, bufSize);
+ strncatz (dstFileName, moduleName, bufSize);
+ }
+ /* use the modulename from the first object file */
+ else if (nrelFiles >= 1)
+ {
+ char *objectName;
+ size_t bufSize;
+
+ strncpyz (buffer, relFiles[0], sizeof(buffer));
+ /* remove extension (it must be .rel) */
+ *strrchr (buffer, '.') = '\0';
+ /* remove path */
+ objectName = strrchr (buffer, DIR_SEPARATOR_CHAR);
+ if (objectName)
+ {
+ ++objectName;
+ }
+ else
+ {
+ objectName = buffer;
+ }
+ bufSize = strlen (dstPath) + strlen (objectName) + 1;
+ dstFileName = Safe_alloc (bufSize);
+ strncpyz (dstFileName, dstPath, bufSize);
+ strncatz (dstFileName, objectName, bufSize);
+ }
+ /* else no module given: help text is displayed */
}
/* set up external stack location if not explicitly specified */
options.xstack_loc = options.xdata_loc;
/* if debug option is set the open the cdbFile */
- if (options.debug && srcFileName)
+ if (options.debug && fullSrcFileName)
{
- sprintf (scratchFileName, "%s.cdb", srcFileName);
+ SNPRINTF (scratchFileName, sizeof(scratchFileName),
+ "%s.adb", dstFileName); //JCF: Nov 30, 2002
if ((cdbFile = fopen (scratchFileName, "w")) == NULL)
werror (E_FILE_OPEN_ERR, scratchFileName);
else
{
FILE *lnkfile;
char *segName, *c;
-
- int i;
- if (!srcFileName)
- srcFileName = "temp";
+ int i, system_ret;
/* first we need to create the <filename>.lnk file */
- sprintf (scratchFileName, "%s.lnk", srcFileName);
+ SNPRINTF (scratchFileName, sizeof(scratchFileName),
+ "%s.lnk", dstFileName);
if (!(lnkfile = fopen (scratchFileName, "w")))
{
werror (E_FILE_OPEN_ERR, scratchFileName);
exit (1);
}
- /* now write the options */
- fprintf (lnkfile, "-mux%c\n", (options.out_fmt ? 's' : 'i'));
+ /* now write the options. JCF: added option 'y' */
+ fprintf (lnkfile, "-myux%c\n", (options.out_fmt ? 's' : 'i'));
/* if iram size specified */
if (options.iram_size)
fprintf (lnkfile, "-a 0x%04x\n", options.iram_size);
+ /* if xram size specified */
+ if (options.xram_size_set)
+ fprintf (lnkfile, "-v 0x%04x\n", options.xram_size);
+
+ /* if code size specified */
+ if (options.code_size)
+ fprintf (lnkfile, "-w 0x%04x\n", options.code_size);
+
if (options.debug)
fprintf (lnkfile, "-z\n");
WRITE_SEG_LOC (CODE_NAME, options.code_loc);
/* data segment start */
- WRITE_SEG_LOC (DATA_NAME, options.data_loc);
+ if(options.data_loc){ /*JCF: If zero, the linker chooses the best place for data*/
+ WRITE_SEG_LOC (DATA_NAME, options.data_loc);
+ }
/* xdata start */
WRITE_SEG_LOC (XDATA_NAME, options.xdata_loc);
/* bit segment start */
WRITE_SEG_LOC (BIT_NAME, 0);
+ /* JCF: stack start */
+ if ( (options.stack_loc) && (options.stack_loc<0x100) ) {
+ WRITE_SEG_LOC ("SSEG", options.stack_loc);
+ }
+
/* add the extra linker options */
for (i = 0; linkOptions[i]; i++)
fprintf (lnkfile, "%s\n", linkOptions[i]);
fprintf (lnkfile, "-l %s\n", libFiles[i]);
/* put in the object files */
- if (strcmp (srcFileName, "temp"))
- fprintf (lnkfile, "%s ", srcFileName);
+ if (fullSrcFileName)
+ fprintf (lnkfile, "%s ", dstFileName);
for (i = 0; i < nrelFiles; i++)
fprintf (lnkfile, "%s\n", relFiles[i]);
if (options.verbose)
printf ("sdcc: Calling linker...\n");
+ /* build linker output filename */
+
+ /* -o option overrides default name? */
+ if (fullDstFileName)
+ {
+ strncpyz (scratchFileName, fullDstFileName, sizeof(scratchFileName));
+ }
+ else
+ {
+ /* the linked file gets the name of the first modul */
+ if (fullSrcFileName)
+ {
+ strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
+ }
+ else
+ {
+ strncpyz (scratchFileName, relFiles[0], sizeof(scratchFileName));
+ /* strip ".rel" extension */
+ *strrchr (scratchFileName, '.') = '\0';
+ }
+ strncatz (scratchFileName,
+ options.out_fmt ? ".S19" : ".ihx",
+ sizeof(scratchFileName));
+ }
+
if (port->linker.cmd)
{
char buffer2[PATH_MAX];
- buildCmdLine (buffer2, port->linker.cmd, srcFileName, NULL, NULL, NULL);
- buildCmdLine2 (buffer, buffer2);
+ buildCmdLine (buffer2, port->linker.cmd, dstFileName, scratchFileName, NULL, NULL);
+ buildCmdLine2 (buffer, buffer2, sizeof(buffer));
}
else
{
- buildCmdLine2 (buffer, port->linker.mcmd);
+ buildCmdLine2 (buffer, port->linker.mcmd, sizeof(buffer));
}
- if (my_system (buffer))
+ system_ret = my_system (buffer);
+ /* TODO: most linker don't have a -o parameter */
+ /* -o option overrides default name? */
+ if (fullDstFileName)
{
- exit (1);
- }
+ char *p, *q;
+ /* the linked file gets the name of the first modul */
+ if (fullSrcFileName)
+ {
+ strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
+ p = strlen (scratchFileName) + scratchFileName;
+ }
+ else
+ {
+ strncpyz (scratchFileName, relFiles[0], sizeof(scratchFileName));
+ /* strip "rel" extension */
+ p = strrchr (scratchFileName, '.');
+ if (p)
+ {
+ p++;
+ *p = 0;
+ }
+
+ }
+ strncatz (scratchFileName,
+ options.out_fmt ? "S19" : "ihx",
+ sizeof(scratchFileName));
+ rename (scratchFileName, fullDstFileName);
- if (strcmp (srcFileName, "temp") == 0)
+ q = strrchr (fullDstFileName, '.');
+ if (q)
+ {
+ /* point after the '.' of the extension */
+ q++;
+ }
+ else
+ {
+ /* no extension: append new extensions */
+ /* Don't we want to append a period here ? */
+ q = strlen (fullDstFileName) + fullDstFileName;
+ }
+
+ *p = 0;
+ strncatz (scratchFileName, "map", sizeof(scratchFileName));
+ *q = 0;
+ strncatz(fullDstFileName, "map", fullDstFileNameLen);
+ rename (scratchFileName, fullDstFileName);
+ *p = 0;
+ strncatz (scratchFileName, "mem", sizeof(scratchFileName));
+ *q = 0;
+ strncatz(fullDstFileName, "mem", fullDstFileNameLen);
+ rename (scratchFileName, fullDstFileName);
+ }
+ if (system_ret)
{
- /* rename "temp.cdb" to "firstRelFile.cdb" */
- char *f = strtok (Safe_strdup (relFiles[0]), ".");
- f = strcat (f, ".cdb");
- rename ("temp.cdb", f);
- srcFileName = NULL;
+ exit (1);
}
}
static void
assemble (char **envp)
{
+ /* build assembler output filename */
+
+ /* -o option overrides default name? */
+ if (options.cc_only && fullDstFileName) {
+ strncpyz (scratchFileName, fullDstFileName, sizeof(scratchFileName));
+ } else {
+ /* the assembled file gets the name of the first modul */
+ strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
+ strncatz (scratchFileName, port->linker.rel_ext,
+ sizeof(scratchFileName));
+ }
+
if (port->assembler.do_assemble) {
port->assembler.do_assemble(asmOptions);
return ;
} else if (port->assembler.cmd) {
- buildCmdLine (buffer, port->assembler.cmd, srcFileName, NULL,
+ buildCmdLine (buffer, port->assembler.cmd, dstFileName, scratchFileName,
options.debug ? port->assembler.debug_opts : port->assembler.plain_opts,
asmOptions);
} else {
- buildCmdLine2 (buffer, port->assembler.mcmd);
+ buildCmdLine2 (buffer, port->assembler.mcmd, sizeof(buffer));
}
if (my_system (buffer)) {
*/
exit (1);
}
+ /* TODO: most assembler don't have a -o parameter */
+ /* -o option overrides default name? */
+ if (options.cc_only && fullDstFileName) {
+ strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
+ strncatz (scratchFileName,
+ port->linker.rel_ext,
+ sizeof(scratchFileName));
+ rename (scratchFileName, fullDstFileName);
+ }
}
/*-----------------------------------------------------------------*/
static int
preProcess (char **envp)
{
- preOutName = NULL;
-
- if (!options.c1mode)
+ if (options.c1mode)
+ {
+ yyin = stdin;
+ }
+ else
{
/* if using external stack define the macro */
if (options.useXstack)
}
setMainValue ("cppextraopts", join(preArgv));
-
- if (!preProcOnly)
+
+ if (preProcOnly)
+ {
+ if (fullDstFileName)
+ {
+ preOutName = Safe_strdup (fullDstFileName);
+ }
+ }
+ else
preOutName = Safe_strdup (tempfilename ());
/* Have to set cppoutfilename to something, even if just pre-processing. */
setMainValue ("cppoutfilename", preOutName ? preOutName : "");
+ addSetHead (&tmpfileNameSet, preOutName);
if (options.verbose)
printf ("sdcc: Calling preprocessor...\n");
- buildCmdLine2 (buffer, _preCmd);
+ buildCmdLine2 (buffer, _preCmd, sizeof(buffer));
if (my_system (buffer))
{
- // @FIX: Dario Vecchio 03-05-2001
- if (preOutName)
- {
- unlink (preOutName);
- Safe_free (preOutName);
- }
- // EndFix
exit (1);
}
-
if (preProcOnly)
- {
- exit (0);
- }
- }
- else
- {
- preOutName = fullSrcFileName;
- }
-
- yyin = fopen (preOutName, "r");
- if (yyin == NULL)
- {
- perror ("Preproc file not found\n");
- exit (1);
+ {
+ exit (0);
+ }
+ yyin = fopen (preOutName, "r");
+ if (yyin == NULL)
+ {
+ perror ("Preproc file not found\n");
+ exit (1);
+ }
+ addSetHead (&tmpfileSet, yyin);
}
return 0;
where expected. If so, set.
*/
getPathDifference (buffer, PREFIX, SDCC_INCLUDE_DIR);
- strcpy (scratchFileName, pprefix);
- strcat (scratchFileName, buffer);
+ strncpyz (scratchFileName, pprefix, sizeof(scratchFileName));
+ strncatz (scratchFileName, buffer, sizeof(scratchFileName));
if (pathExists (scratchFileName))
{
}
getPathDifference (buffer, PREFIX, SDCC_LIB_DIR);
- strcpy (scratchFileName, pprefix);
- strcat (scratchFileName, buffer);
+ strncpyz (scratchFileName, pprefix, sizeof(scratchFileName));
+ strncatz (scratchFileName, buffer, sizeof(scratchFileName));
if (pathExists (scratchFileName))
{
*/
if (strchr (argv0, DIR_SEPARATOR_CHAR))
{
- strcpy (scratchFileName, argv0);
+ strncpyz (scratchFileName, argv0, sizeof(scratchFileName));
*strrchr (scratchFileName, DIR_SEPARATOR_CHAR) = '\0';
setMainValue ("bindir", scratchFileName);
ExePathList[0] = Safe_strdup (scratchFileName);
else if (getenv (SDCCDIR_NAME) != NULL)
{
getPathDifference (buffer, PREFIX, BINDIR);
- strcpy (scratchFileName, getenv (SDCCDIR_NAME));
- strcat (scratchFileName, buffer);
+ strncpyz (scratchFileName, getenv (SDCCDIR_NAME), sizeof(scratchFileName));
+ strncatz (scratchFileName, buffer, sizeof(scratchFileName));
setMainValue ("bindir", scratchFileName);
ExePathList[0] = Safe_strdup (scratchFileName);
}
ExePathList[0] = BINDIR;
}
- do
+ do
{
/* Case 1 */
if (getenv (SDCCDIR_NAME) != NULL)
setMainValue ("objext", port->linker.rel_ext);
setMainValue ("asmext", port->assembler.file_ext);
+ setMainValue ("dstfilename", dstFileName);
setMainValue ("fullsrcfilename", fullSrcFileName ? fullSrcFileName : "fullsrcfilename");
- setMainValue ("srcfilename", srcFileName ? srcFileName : "srcfilename");
+
+ if (options.cc_only && fullDstFileName)
+ /* compile + assemble and -o given: -o specifies name of object file */
+ {
+ setMainValue ("objdstfilename", fullDstFileName);
+ }
+ else
+ {
+ setMainValue ("objdstfilename", "{stdobjdstfilename}");
+ }
+ if (fullDstFileName)
+ /* if we're linking, -o gives the final file name */
+ {
+ setMainValue ("linkdstfilename", fullDstFileName);
+ }
+ else
+ {
+ setMainValue ("linkdstfilename", "{stdlinkdstfilename}");
+ }
+
+}
+
+static void
+sig_handler (int signal)
+{
+ char *sig_string;
+
+ switch (signal)
+ {
+ case SIGABRT:
+ sig_string = "SIGABRT";
+ break;
+ case SIGTERM:
+ sig_string = "SIGTERM";
+ break;
+ case SIGINT:
+ sig_string = "SIGINT";
+ break;
+ case SIGSEGV:
+ sig_string = "SIGSEGV";
+ break;
+ default:
+ sig_string = "Unknown?";
+ break;
+ }
+ fprintf (stderr, "Caught signal %d: %s\n", signal, sig_string);
+ exit (1);
}
/*
/* install atexit handler */
atexit(rm_tmpfiles);
- /* Before parsing the command line options, do a
+ /* install signal handler;
+ it's only purpuse is to call exit() to remove temp files */
+ if (!getenv("SDCC_LEAVE_SIGNALS"))
+ {
+ signal (SIGABRT, sig_handler);
+ signal (SIGTERM, sig_handler);
+ signal (SIGINT , sig_handler);
+ signal (SIGSEGV, sig_handler);
+ }
+
+ /* 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).
parseCmdLine (argc, argv);
/* if no input then printUsage & exit */
- if ((!options.c1mode && !srcFileName && !nrelFiles) ||
- (options.c1mode && !srcFileName && !options.out_name))
+ if (!options.c1mode && !fullSrcFileName && !nrelFiles)
{
printUsage ();
exit (0);
initValues ();
_discoverPaths (argv[0]);
- if (srcFileName)
- {
-
- initMem ();
+ /* initMem() is expensive, but
+ initMem() must called before port->finaliseOptions ().
+ And the z80 port needs port->finaliseOptions(),
+ even if we're only linking. */
+ initMem ();
+ port->finaliseOptions ();
- port->finaliseOptions ();
+ if (fullSrcFileName || options.c1mode)
+ {
preProcess (envp);
initSymt ();
printf ("sdcc: Generating code...\n");
yyparse ();
-
if (fatalError) {
- // @FIX: Dario Vecchio 03-05-2001
- if (preOutName) {
- if (yyin && yyin != stdin)
- fclose (yyin);
- unlink (preOutName);
- Safe_free (preOutName);
- }
- // EndFix
- return 1;
+ exit (1);
}
if (TARGET_IS_PIC) {
assemble (envp);
}
}
-
closeDumpFiles();
if (cdbFile)
fclose (cdbFile);
- if (yyin && yyin != stdin)
- fclose (yyin);
-
- if (preOutName && !options.c1mode)
- {
- unlink (preOutName);
- Safe_free (preOutName);
- }
-
if (!options.cc_only &&
!fatalError &&
!noAssemble &&
!options.c1mode &&
- (srcFileName || nrelFiles))
+ (fullSrcFileName || nrelFiles))
{
if (port->linker.do_link)
port->linker.do_link ();