//extern int wait (int *);
char *preOutName;
+/* Far functions, far data */
#define OPTION_LARGE_MODEL "-model-large"
+/* Far functions, near data */
+#define OPTION_MEDIUM_MODEL "-model-medium"
#define OPTION_SMALL_MODEL "-model-small"
#define OPTION_FLAT24_MODEL "-model-flat24"
#define OPTION_STACK_AUTO "-stack-auto"
#if !OPT_DISABLE_AVR
extern PORT avr_port;
#endif
+#if !OPT_DISABLE_DS390
+extern PORT ds390_port;
+#endif
+
PORT *port;
#if !OPT_DISABLE_AVR
&avr_port,
#endif
+#if !OPT_DISABLE_DS390
+ &ds390_port,
+#endif
};
#define NUM_PORTS (sizeof(_ports)/sizeof(_ports[0]))
exit(1);
}
-static void _buildCmdLine(char *into, char **args, const char **cmds,
+void buildCmdLine(char *into, char **args, const char **cmds,
const char *p1, const char *p2,
const char *p3, const char **list)
{
/* See if it has a '$' anywhere - if not, just copy */
if ((p = strchr(from, '$'))) {
strncpy(into, from, p - from);
+ /* NULL terminate it */
+ into[p-from] = '\0';
from = p+2;
p++;
switch (*p) {
"SDCC : ");
for (i=0; i<NUM_PORTS; i++)
fprintf(stderr, "%s%s", i==0 ? "" : "/", _ports[i]->target);
-
- fprintf(stderr, " %s `"
+ fprintf(stderr, " %s"
+#ifdef SDCC_SUB_VERSION_STR
+ "/" SDCC_SUB_VERSION_STR
+#endif
+ " ` "
#ifdef __CYGWIN32__
" (CYGWIN32)\n"
#else
" (UNIX) \n"
# endif
#endif
+
, VersionString
);
}
options.idata_loc = 0x80;
options.genericPtr = 1; /* default on */
options.nopeep = 0;
+ options.model = port->general.default_model;
/* now for the optimizations */
/* turn on the everything */
/* if the extention is type .rel or .r or .REL or .R
addtional object file will be passed to the linker */
if (strcmp(fext,".r") == 0 || strcmp(fext,".rel") == 0 ||
- strcmp(fext,".R") == 0 || strcmp(fext,".REL") == 0) {
-
+ strcmp(fext,".R") == 0 || strcmp(fext,".REL") == 0 ||
+ strcmp(fext, port->linker.rel_ext) == 0)
+ {
relFiles[nrelFiles++] = s;
return ;
}
*(++list) = NULL;
}
+static void _setModel(int model, const char *sz)
+{
+ if (port->general.supported_models & model)
+ options.model = model;
+ else
+ werror(W_UNSUPPORTED_MODEL, sz, port->target);
+}
+
/*-----------------------------------------------------------------*/
/* parseCmdLine - parses the command line and sets the options */
/*-----------------------------------------------------------------*/
}
if (strcmp(&argv[i][1],OPTION_LARGE_MODEL) == 0) {
- options.model = MODEL_LARGE;
+ _setModel(MODEL_LARGE, argv[i]);
+ continue;
+ }
+
+ if (strcmp(&argv[i][1],OPTION_MEDIUM_MODEL) == 0) {
+ _setModel(MODEL_MEDIUM, argv[i]);
continue;
}
if (strcmp(&argv[i][1],OPTION_SMALL_MODEL) == 0) {
- options.model = MODEL_SMALL;
+ _setModel(MODEL_SMALL, argv[i]);
continue;
}
if (strcmp(&argv[i][1],OPTION_FLAT24_MODEL) == 0) {
- options.model = MODEL_FLAT24;
+ _setModel(MODEL_FLAT24, argv[i]);
continue;
}
fprintf (lnkfile,"\n-e\n");
fclose(lnkfile);
- _buildCmdLine(buffer, argv, port->linker.cmd, srcFileName, NULL, NULL, NULL);
+ buildCmdLine(buffer, argv, port->linker.cmd, srcFileName, NULL, NULL, NULL);
/* call the linker */
if (my_system(argv[0], argv)) {
{
char *argv[128]; /* assembler arguments */
- _buildCmdLine(buffer, argv, port->assembler.cmd, srcFileName, NULL, NULL, asmOptions);
+ buildCmdLine(buffer, argv, port->assembler.cmd, srcFileName, NULL, NULL, asmOptions);
if (my_system(argv[0], argv)) {
perror("Cannot exec assember");
case MODEL_SMALL:
_addToList(preArgv, "-DSDCC_MODEL_SMALL");
break;
+ case MODEL_COMPACT:
+ _addToList(preArgv, "-DSDCC_MODEL_COMPACT");
+ break;
+ case MODEL_MEDIUM:
+ _addToList(preArgv, "-DSDCC_MODEL_MEDIUM");
+ break;
case MODEL_FLAT24:
_addToList(preArgv, "-DSDCC_MODEL_FLAT24");
break;
if (!preProcOnly)
preOutName = strdup(tmpnam(NULL));
- _buildCmdLine(buffer, argv, _preCmd, fullSrcFileName,
+ buildCmdLine(buffer, argv, _preCmd, fullSrcFileName,
preOutName, srcFileName, preArgv);
if (my_system(argv[0], argv)) {
!fatalError &&
!noAssemble &&
!options.c1mode &&
- (srcFileName || nrelFiles))
- linkEdit (envp);
+ (srcFileName || nrelFiles)) {
+ if (port->linker.do_link)
+ port->linker.do_link();
+ else
+ linkEdit (envp);
+ }
if (yyin && yyin != stdin)
fclose(yyin);