#define OPTION_NO_LOOP_IND "--noinduction"
#define OPTION_LESS_PEDANTIC "--less-pedantic"
#define OPTION_DISABLE_WARNING "--disable-warning"
+#define OPTION_WERROR "--Werror"
#define OPTION_NO_GCSE "--nogcse"
#define OPTION_SHORT_IS_8BITS "--short-is-8bits"
#define OPTION_NO_XINIT_OPT "--no-xinit-opt"
{ 0, "--nostdinc", &options.nostdinc, "Do not include the standard include directory in the search path" },
{ 0, OPTION_LESS_PEDANTIC, NULL, "Disable some of the more pedantic warnings" },
{ 0, OPTION_DISABLE_WARNING, NULL, "<nnnn> Disable specific warning" },
+ { 0, OPTION_WERROR, NULL, "Treat the warnings as errors" },
{ 0, "--debug", &options.debug, "Enable debugging symbol output" },
{ 0, "--cyclomatic", &options.cyclomatic, "Display complexity of compiled functions" },
{ 0, OPTION_STD_C89, NULL, "Use C89 standard only" },
{ 0, OPTION_SMALL_MODEL, NULL, "internal data space is used (default)" },
{ 0, "--stack-auto", &options.stackAuto, "Stack automatic variables" },
{ 0, "--xstack", &options.useXstack, "Use external stack" },
- { 0, "--int-long-reent", &options.intlong_rent, "Use reenterant calls on the int and long support functions" },
- { 0, "--float-reent", &options.float_rent, "Use reenterant calls on the float support functions" },
+ { 0, "--int-long-reent", &options.intlong_rent, "Use reentrant calls on the int and long support functions" },
+ { 0, "--float-reent", &options.float_rent, "Use reentrant calls on the float support functions" },
{ 0, "--main-return", &options.mainreturn, "Issue a return after main()" },
{ 0, "--xram-movc", &options.xram_movc, "Use movc instead of movx to read xram (xdata)" },
{ 0, OPTION_CALLEE_SAVES, &options.calleeSavesSet, "<func[,func,...]> Cause the called function to save registers insted of the caller", CLAT_SET },
NULL
};
-static const char *_preCmd = "{cpp} -nostdinc -Wall -std=c99 {cppextraopts} \"{fullsrcfilename}\" \"{cppoutfilename}\"";
+static const char *_preCmd = "{cpp} -nostdinc -Wall {cppstd}{cppextraopts} \"{fullsrcfilename}\" \"{cppoutfilename}\"";
PORT *port;
#ifdef SDCC_SUB_VERSION_STR
"/" SDCC_SUB_VERSION_STR
#endif
- " #%s (" __DATE__ ") (%s)\n",
- getBuildNumber(), getBuildEnvironment() );
+ " #%s (%s) (%s)\n",
+ getBuildNumber(), getBuildDate(), getBuildEnvironment() );
}
static void
continue;
}
+ if (strcmp (argv[i], OPTION_WERROR) == 0)
+ {
+ setWError(1);
+ addSet(&preArgvSet, Safe_strdup("-Werror"));
+ continue;
+ }
+
if (strcmp (&argv[i][1], OPTION_SHORT_IS_8BITS) == 0)
{
options.shortis8bits=1;
werror (E_NEED_OPT_O_IN_C1);
exit (EXIT_FAILURE);
}
+ else
+ {
+ char *p;
+
+ moduleName = Safe_strdup(dstFileName);
+ for (p = moduleName; *p; ++p)
+ if (!isalnum ((unsigned char)*p))
+ *p = '_';
+ }
}
/* if no dstFileName given with -o, we've to find one: */
if (!dstFileName)
/* if code size specified */
if (options.code_size)
fprintf (lnkfile, "-w 0x%04x\n", options.code_size);
-
- if (options.debug)
- fprintf (lnkfile, "-z\n");
}
+ if (options.debug)
+ fprintf (lnkfile, "-z\n");
+
#define WRITE_SEG_LOC(N, L) \
if (N) \
{ \
break;
}
+ /* set macro corresponding to compiler option */
+ if (options.intlong_rent)
+ addSet(&preArgvSet, Safe_strdup("-DSDCC_INT_LONG_REENT"));
+
+ /* set macro corresponding to compiler option */
+ if (options.float_rent)
+ addSet(&preArgvSet, Safe_strdup("-DSDCC_FLOAT_REENT"));
+
/* add SDCC version number */
{
char buf[20];
addSet(&preArgvSet, Safe_strdup(buf));
}
+ /* add SDCC revision number */
+ {
+ char buf[25];
+ SNPRINTF(buf, sizeof(buf), "-DSDCC_REVISION=%s", getBuildNumber());
+ addSet(&preArgvSet, Safe_strdup(buf));
+ }
+
/* add port (processor information to processor */
addSet(&preArgvSet, Safe_strdup("-DSDCC_{port}"));
addSet(&preArgvSet, Safe_strdup("-D__{port}"));
/* standard include path */
if (!options.nostdinc) {
- inclList = appendStrSet(includeDirsSet, "-I\"", "\"");
+ inclList = appendStrSet(includeDirsSet, "-isystem \"", "\"");
mergeSets(&preArgvSet, inclList);
}
/* Set bin paths */
static void
-setBinPaths(const char *argv0)
+setBinPaths (const char *argv0)
{
const char *p;
char buf[PATH_MAX];
/* do it in reverse mode, so that addSetHead() can be used
instead of slower addSet() */
- if ((p = getBinPath(argv0)) != NULL)
- addSetHead(&binPathSet, (void *)p);
+ if ((p = getBinPath (argv0)) != NULL)
+ addSetHead (&binPathSet, (void *)p);
- if ((p = getenv(SDCC_DIR_NAME)) != NULL) {
- SNPRINTF(buf, sizeof buf, "%s" PREFIX2BIN_DIR, p);
- addSetHead(&binPathSet, Safe_strdup(buf));
+ if ((p = getenv (SDCC_DIR_NAME)) != NULL) {
+ SNPRINTF (buf, sizeof buf, "%s" PREFIX2BIN_DIR, p);
+ addSetHead (&binPathSet, Safe_strdup (buf));
}
}
/* Set system include path */
static void
-setIncludePath(void)
+setIncludePath (void)
{
char *p;
- char *p2=NULL;
- set *tempSet=NULL;
+ char *p2 = NULL;
+ set *tempSet = NULL;
/*
* Search logic:
if (options.nostdinc)
return;
- tempSet = appendStrSet(dataDirsSet, NULL, INCLUDE_DIR_SUFFIX);
- includeDirsSet = appendStrSet(tempSet, NULL, DIR_SEPARATOR_STRING);
- includeDirsSet = appendStrSet(includeDirsSet, NULL, port->target);
- mergeSets(&includeDirsSet, tempSet);
+ tempSet = appendStrSet (dataDirsSet, NULL, INCLUDE_DIR_SUFFIX);
+ includeDirsSet = appendStrSet (tempSet, NULL, DIR_SEPARATOR_STRING);
+ includeDirsSet = appendStrSet (includeDirsSet, NULL, port->target);
+ mergeSets (&includeDirsSet, tempSet);
- if ((p = getenv(SDCC_INCLUDE_NAME)) != NULL)
- {
- addSetHead(&includeDirsSet, p);
- p2=Safe_alloc(strlen(p)+strlen(DIR_SEPARATOR_STRING)+strlen(port->target)+1);
- if(p2!=NULL)
+ if ((p = getenv (SDCC_INCLUDE_NAME)) != NULL)
{
- strcpy(p2, p);
- strcat(p2, DIR_SEPARATOR_STRING);
- strcat(p2, port->target);
- addSetHead(&includeDirsSet, p2);
+ addSetHead(&includeDirsSet, p);
+ p2=Safe_alloc(strlen(p)+strlen(DIR_SEPARATOR_STRING)+strlen(port->target)+1);
+ if (p2 != NULL)
+ {
+ strcpy (p2, p);
+ strcat (p2, DIR_SEPARATOR_STRING);
+ strcat (p2, port->target);
+ addSetHead (&includeDirsSet, p2);
+ }
}
- }
}
/* Set system lib path */
static void
-setLibPath(void)
+setLibPath (void)
{
char *p;
if (options.nostdlib)
return;
- libDirsSet = appendStrSet(dataDirsSet, NULL, LIB_DIR_SUFFIX);
+ libDirsSet = appendStrSet (dataDirsSet, NULL, LIB_DIR_SUFFIX);
- if ((p = getenv(SDCC_LIB_NAME)) != NULL)
- addSetHead(&libDirsSet, p);
+ if ((p = getenv (SDCC_LIB_NAME)) != NULL)
+ addSetHead (&libDirsSet, p);
}
/* Set data path */
static void
-setDataPaths(const char *argv0)
+setDataPaths (const char *argv0)
{
const char *p;
char buf[PATH_MAX];
* 3. - DATADIR (only on *nix)
*/
- if ((p = getenv(SDCC_DIR_NAME)) != NULL) {
- SNPRINTF(buf, sizeof buf, "%s" PREFIX2DATA_DIR, p);
- addSet(&dataDirsSet, Safe_strdup(buf));
+ if ((p = getenv (SDCC_DIR_NAME)) != NULL) {
+ SNPRINTF (buf, sizeof buf, "%s" PREFIX2DATA_DIR, p);
+ addSet (&dataDirsSet, Safe_strdup (buf));
}
- if ((p = getBinPath(argv0)) != NULL) {
- SNPRINTF(buf, sizeof buf, "%s" BIN2DATA_DIR, p);
- free((void *)p);
- addSet(&dataDirsSet, Safe_strdup(buf));
+ if ((p = getBinPath (argv0)) != NULL) {
+ SNPRINTF (buf, sizeof buf, "%s" BIN2DATA_DIR, p);
+ Safe_free ((void *)p);
+ addSet (&dataDirsSet, Safe_strdup(buf));
}
#ifdef _WIN32
- if (peekSet(dataDirsSet) == NULL) {
+ if (peekSet (dataDirsSet) == NULL) {
/* this should never happen... */
- wassertl(0, "Can't get binary path");
+ wassertl (0, "Can't get binary path");
}
#else
- addSet(&dataDirsSet, Safe_strdup(DATADIR));
+ addSet (&dataDirsSet, Safe_strdup (DATADIR));
#endif
- setIncludePath();
- setLibPath();
+ setIncludePath ();
+ setLibPath ();
}
static void
setMainValue ("linkdstfilename", "{stdlinkdstfilename}");
}
+ /*
+ * Make sure the preprocessor is called with the "-std" option
+ * corresponding to the --std used to start sdcc
+ */
+ if (options.std_c99)
+ {
+ if (!options.std_sdcc)
+ setMainValue ("cppstd", "-std=c99 ");
+ }
+ else
+ {
+ if (!options.std_sdcc)
+ setMainValue ("cppstd", "-std=c89 ");
+ }
}
static void doPrintSearchDirs(void)
/* install signal handler;
it's only purpose is to call exit() to remove temp files */
- if (!getenv("SDCC_LEAVE_SIGNALS"))
+ if (!getenv ("SDCC_LEAVE_SIGNALS"))
{
signal (SIGABRT, sig_handler);
signal (SIGTERM, sig_handler);
_findPort (argc, argv);
#ifdef JAMIN_DS390
- if (strcmp(port->target, "mcs51") == 0) {
- printf("DS390 jammed in A\n");
+ if (strcmp (port->target, "mcs51") == 0) {
+ printf ("DS390 jammed in A\n");
_setPort ("ds390");
ds390_jammed = 1;
}
initValues ();
- setBinPaths(argv[0]);
- setDataPaths(argv[0]);
+ setBinPaths (argv[0]);
+ setDataPaths (argv[0]);
if (port->initPaths)
port->initPaths();
yyparse ();
- if (pclose(yyin))
- fatalError = 1;
+ if (!options.c1mode)
+ if (pclose(yyin))
+ fatalError = 1;
- if (fatalError) {
+ if (fatalError)
exit (EXIT_FAILURE);
- }
if (port->general.do_glue != NULL)
(*port->general.do_glue) ();
glue ();
}
- if (fatalError) {
+ if (fatalError)
exit (EXIT_FAILURE);
- }
if (!options.c1mode && !noAssemble)
{
closeDumpFiles();
if (options.debug && debugFile)
- debugFile->closeFile();
+ debugFile->closeFile ();
if (!options.cc_only &&
!fatalError &&
!noAssemble &&
!options.c1mode &&
- (fullSrcFileName || peekSet(relFilesSet) != NULL))
+ (fullSrcFileName || peekSet (relFilesSet) != NULL))
{
if (options.verbose)
printf ("sdcc: Calling linker...\n");