#include "MySystem.h"
#include "SDCCmacro.h"
#include "SDCCutil.h"
+#include "SDCCdebug.h"
#include "SDCCargs.h"
-#if NATIVE_WIN32
+#ifdef _WIN32
#include <process.h>
-#endif
-
-#if !defined(__BORLANDC__) && !defined(_MSC_VER)
+#else
#include <sys/stat.h>
#include <unistd.h>
#endif
extern int yyparse ();
FILE *srcFile; /* source file */
-FILE *cdbFile = NULL; /* debugger information output file */
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; */
/* "" is equivalent with cwd */
char *moduleName; /* module name is source file without path and extension */
/* can be NULL while linking without compiling */
+/*
+ * in following definitions fixed length arrays are very dangerous!
+ * Sets should be used instead. See definition of asmOptions.
+ */
const char *preArgv[128]; /* pre-processor arguments */
int currRegBank = 0;
-int RegBankUsed[4]={1, 0, 0, 0}; /*JCF: Reg Bank 0 used by default*/
+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 preProcOnly = 0;
int noAssemble = 0;
+set *asmOptions = NULL; /* set of assembler options */
char *linkOptions[128];
-const char *asmOptions[128];
char *libFiles[128];
int nlibFiles = 0;
char *libPaths[128];
int nlibPaths = 0;
char *relFiles[128];
int nrelFiles = 0;
-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];
-
-// In MSC VC6 default search path for exe's to path for this
-
-char DefaultExePath[128];
+char buffer[PATH_MAX * 2];
#define OPTION_HELP "-help"
#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_LESS_PEDANTIC "--less-pedantic"
#define OPTION_NO_GCSE "--nogcse"
#define OPTION_SHORT_IS_8BITS "--short-is-8bits"
#define OPTION_TINI_LIBID "--tini-libid"
{ 0, "--stack-10bit", &options.stack10bit, "use the 10bit stack for ds390 (default)" },
{ 0, "--xstack", &options.useXstack, "Use external stack" },
{ 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" },
/** List of all default constant macros.
*/
static const char *_baseValues[] = {
- "cpp", "{bindir}{sep}sdcpp",
+ "cpp", "sdcpp",
"cppextraopts", "",
/* Path seperator character */
"sep", DIR_SEPARATOR_STRING,
for (i = 0; i < NUM_PORTS; i++)
fprintf (stderr, "%s%s", i == 0 ? "" : "/", _ports[i]->target);
- fprintf (stderr, " %s"
+ fprintf (stderr, " " SDCC_VERSION_STR
#ifdef SDCC_SUB_VERSION_STR
"/" SDCC_SUB_VERSION_STR
#endif
" (CYGWIN)\n"
#elif defined __MINGW32__
" (MINGW32) \n"
-#else
-# ifdef __DJGPP__
+#elif defined __DJGPP__
" (DJGPP) \n"
-# else
-# if defined(_MSC_VER)
- " (WIN32) \n"
-# else
+#elif defined(_MSC_VER)
+ " (MSVC) \n"
+#elif defined(__BORLANDC__)
+ " (BORLANDC) \n"
+#else
" (UNIX) \n"
-# endif
-# endif
#endif
-
- ,VersionString
);
}
}
}
+/*-----------------------------------------------------------------*/
+/* setParseWithComma - separates string with comma to a set */
+/*-----------------------------------------------------------------*/
+void
+setParseWithComma (set **dest, char *src)
+{
+ char *p;
+
+ /* skip the initial white spaces */
+ while (isspace (*src))
+ src++;
+
+ if ((p = strtok(src, ",")) != NULL) {
+ do
+ {
+ addSet(dest, p);
+ } while ((p = strtok(NULL, ",")) != NULL);
+ }
+}
+
/*-----------------------------------------------------------------*/
/* setDefaultOptions - sets the default options */
/*-----------------------------------------------------------------*/
int i;
for (i = 0; i < 128; i++)
- preArgv[i] = asmOptions[i] =
- linkOptions[i] = relFiles[i] = libFiles[i] =
- libPaths[i] = NULL;
+ preArgv[i] = linkOptions[i] = relFiles[i] = libFiles[i] = libPaths[i] = NULL;
/* first the options part */
options.stack_loc = 0; /* stack pointer initialised to 0 */
}
/* copy the file name into the buffer */
- strncpyz (buffer, s, PATH_MAX);
+ strncpyz (buffer, s, sizeof(buffer));
/* get rid of the "."-extension */
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;
char *p;
/* copy the file name into the buffer */
- strncpyz(buffer, getStringArg("-o", argv, &i, argc), PATH_MAX);
+ strncpyz(buffer, getStringArg("-o", argv, &i, argc),
+ sizeof(buffer));
/* point to last character */
p = buffer + strlen (buffer) - 1;
if (*p == DIR_SEPARATOR_CHAR)
/* assembler options */
else if (argv[i][2] == 'a')
{
- parseWithComma ((char **) asmOptions, getStringArg("-Wa", argv, &i, argc));
+ setParseWithComma (&asmOptions, getStringArg("-Wa", argv, &i, argc));
}
else
{
addToList (preArgv, "-C");
break;
}
+
case 'd':
case 'D':
case 'I':
char *objectName;
size_t bufSize;
- strncpyz (buffer, relFiles[0], PATH_MAX);
+ strncpyz (buffer, relFiles[0], sizeof(buffer));
/* remove extension (it must be .rel) */
*strrchr (buffer, '.') = '\0';
/* remove path */
if (!options.xstack_loc)
options.xstack_loc = options.xdata_loc;
- /* if debug option is set the open the cdbFile */
+ /* if debug option is set then open the cdbFile */
if (options.debug && fullSrcFileName)
{
SNPRINTF (scratchFileName, sizeof(scratchFileName),
"%s.adb", dstFileName); //JCF: Nov 30, 2002
- if ((cdbFile = fopen (scratchFileName, "w")) == NULL)
- werror (E_FILE_OPEN_ERR, scratchFileName);
+ if(debugFile->openFile(scratchFileName))
+ debugFile->writeModule(moduleName);
else
- {
- /* add a module record */
- fprintf (cdbFile, "M:%s\n", moduleName);
- }
+ werror (E_FILE_OPEN_ERR, scratchFileName);
}
return 0;
}
{
char buffer2[PATH_MAX];
buildCmdLine (buffer2, port->linker.cmd, dstFileName, scratchFileName, NULL, NULL);
- buildCmdLine2 (buffer, buffer2, PATH_MAX);
+ buildCmdLine2 (buffer, buffer2, sizeof(buffer));
}
else
{
- buildCmdLine2 (buffer, port->linker.mcmd, PATH_MAX);
+ buildCmdLine2 (buffer, port->linker.mcmd, sizeof(buffer));
}
system_ret = my_system (buffer);
strncpyz (scratchFileName, fullDstFileName, sizeof(scratchFileName));
} else {
/* the assembled file gets the name of the first modul */
- strncpyz (scratchFileName, dstFileName, PATH_MAX);
- strncatz (scratchFileName, port->linker.rel_ext, PATH_MAX);
+ strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
+ strncatz (scratchFileName, port->linker.rel_ext,
+ sizeof(scratchFileName));
}
if (port->assembler.do_assemble) {
setMainValue ("cppextraopts", join(preArgv));
- if (preProcOnly)
- {
- if (fullDstFileName)
- {
- preOutName = Safe_strdup (fullDstFileName);
- }
- }
+ if (preProcOnly && fullDstFileName)
+ {
+ /* -E and -o given */
+ setMainValue ("cppoutfilename", fullDstFileName);
+ }
else
- preOutName = Safe_strdup (tempfilename ());
-
- /* Have to set cppoutfilename to something, even if just pre-processing. */
- setMainValue ("cppoutfilename", preOutName ? preOutName : "");
- addSetHead (&tmpfileNameSet, preOutName);
+ {
+ /* Piping: set cppoutfilename to NULL, to avoid empty quotes */
+ setMainValue ("cppoutfilename", NULL);
+ }
if (options.verbose)
printf ("sdcc: Calling preprocessor...\n");
- buildCmdLine2 (buffer, _preCmd, PATH_MAX);
+ buildCmdLine2 (buffer, _preCmd, sizeof(buffer));
- if (my_system (buffer))
- {
+ if (preProcOnly) {
+ if (my_system (buffer)) {
exit (1);
}
- if (preProcOnly)
- {
- exit (0);
- }
- yyin = fopen (preOutName, "r");
- if (yyin == NULL)
- {
- perror ("Preproc file not found\n");
+
+ exit (0);
+ }
+
+ yyin = my_popen (buffer);
+ if (yyin == NULL) {
+ perror ("Preproc file not found");
exit (1);
- }
- addSetHead (&tmpfileSet, yyin);
+ }
+ addSetHead (&pipeSet, yyin);
}
return 0;
strncpyz (scratchFileName, argv0, sizeof(scratchFileName));
*strrchr (scratchFileName, DIR_SEPARATOR_CHAR) = '\0';
setMainValue ("bindir", scratchFileName);
- ExePathList[0] = Safe_strdup (scratchFileName);
+ addSet(&binPathSet, Safe_strdup (scratchFileName));
}
else if (getenv (SDCCDIR_NAME) != NULL)
{
getPathDifference (buffer, PREFIX, BINDIR);
strncpyz (scratchFileName, getenv (SDCCDIR_NAME), sizeof(scratchFileName));
- strncatz (scratchFileName, buffer, PATH_MAX);
+ strncatz (scratchFileName, buffer, sizeof(scratchFileName));
setMainValue ("bindir", scratchFileName);
- ExePathList[0] = Safe_strdup (scratchFileName);
+ addSet(&binPathSet, Safe_strdup (scratchFileName));
}
else
{
setMainValue ("bindir", BINDIR);
- ExePathList[0] = BINDIR;
+ addSet(&binPathSet, BINDIR);
}
do
printf ("sdcc: Generating code...\n");
yyparse ();
+
+ pclose(yyin);
+ deleteSetItem(&pipeSet, yyin);
+
if (fatalError) {
exit (1);
}
}
closeDumpFiles();
- if (cdbFile)
- fclose (cdbFile);
+ if (options.debug && debugFile)
+ debugFile->closeFile();
if (!options.cc_only &&
!fatalError &&