#if NATIVE_WIN32
#include <process.h>
-#else
-#include "spawn.h"
#endif
#if !defined(__BORLANDC__) && !defined(_MSC_VER)
#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"
static const OPTION
optionsTable[] = {
{ 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_LOOP_INV, NULL, "Disable optimisation of invariants" },
{ 0, OPTION_NO_LOOP_IND, NULL, 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, "--help", NULL, "Display this help" },
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" },
" (" __DATE__ ")"
#ifdef __CYGWIN__
" (CYGWIN)\n"
+#elif defined __MINGW32__
+ " (MINGW32) \n"
#else
-#ifdef __DJGPP__
+# ifdef __DJGPP__
" (DJGPP) \n"
-#else
-#if defined(_MSC_VER)
+# else
+# if defined(_MSC_VER)
" (WIN32) \n"
-#else
+# else
" (UNIX) \n"
-#endif
-#endif
+# endif
+# endif
#endif
,VersionString
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;
}
/* 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);
}
-static void
-_processC1Arg (char *s)
-{
- if (fullSrcFileName)
- {
- 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)
{
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);
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 (!port->parseOption (&argc, argv, &i))
{
/* no option must be a filename */
- if (options.c1mode)
- _processC1Arg (argv[i]);
- else
- processFile (argv[i]);
+ processFile (argv[i]);
}
}
{
FILE *lnkfile;
char *segName, *c;
- int i;
+ int i, system_ret;
/* first we need to create the <filename>.lnk file */
sprintf (scratchFileName, "%s.lnk", dstFileName);
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");
buildCmdLine2 (buffer, port->linker.mcmd);
}
- if (my_system (buffer))
- {
- exit (1);
- }
+ system_ret = my_system (buffer);
/* TODO: most linker don't have a -o parameter */
/* -o option overrides default name? */
if (fullDstFileName)
{
+ char *p, *q;
/* the linked file gets the name of the first modul */
if (fullSrcFileName)
- {
+ {
strcpy (scratchFileName, dstFileName);
+ p = strlen (scratchFileName) + scratchFileName;
}
else
{
strcpy (scratchFileName, relFiles[0]);
- /* strip ".rel" extension */
- *strrchr (scratchFileName, '.') = '\0';
+ /* strip "rel" extension */
+ p = strrchr (scratchFileName, '.') + 1;
}
- strcat (scratchFileName, options.out_fmt ? ".S19" : ".ihx");
+ strcpy (p, options.out_fmt ? "S19" : "ihx");
+ rename (scratchFileName, fullDstFileName);
+
+ q = strrchr (fullDstFileName, '.');
+ if (q)
+ {
+ /* point after the '.' of the extension */
+ q++;
+ }
+ else
+ {
+ /* no extension: append new extensions */
+ q = strlen (fullDstFileName) + fullDstFileName;
+ }
+ strcpy (p, "map");
+ strcpy (q, "map");
+ rename (scratchFileName, fullDstFileName);
+ strcpy (p, "mem");
+ strcpy (q, "mem");
rename (scratchFileName, fullDstFileName);
}
+ if (system_ret)
+ {
+ exit (1);
+ }
}
/*-----------------------------------------------------------------*/
}
setMainValue ("cppextraopts", join(preArgv));
-
+
if (preProcOnly)
{
if (fullDstFileName)
/* if no input then printUsage & exit */
if ((!options.c1mode && !fullSrcFileName && !nrelFiles) ||
- (options.c1mode && !fullSrcFileName && !options.out_name))
+ (options.c1mode && !fullSrcFileName))
{
printUsage ();
exit (0);
initValues ();
_discoverPaths (argv[0]);
+ /* 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 ();
+
if (fullSrcFileName)
{
-
- initMem ();
-
- port->finaliseOptions ();
preProcess (envp);
initSymt ();