summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
6ee15ba)
* src/SDCCmain.c (preProcess): make sure, that preOutName will be deleted;
make -V work again; --c1mode reads now from stdin
* doc/sdccman.lyx: added --c1mode
* support/Util/SDCCerr.c: new messages for c1 mode
* support/Util/SDCCerr.h: new messages for c1 mode
* src/SDCC.lex (checkCurrFile): test if fullSrcFileName is NULL for c1mode
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2274
4a8a32a2-be11-0410-ad9d-
d568d2c75423
+2003-02-15 Bernhard Held <bernhard@bernhardheld.de>
+
+ * src/SDCCglue.h: make tmpfileNameSet available for preOutName
+ * src/SDCCmain.c (preProcess): make sure, that preOutName will be deleted;
+ make -V work again; --c1mode reads now from stdin
+ * doc/sdccman.lyx: added --c1mode
+ * support/Util/SDCCerr.c: new messages for c1 mode
+ * support/Util/SDCCerr.h: new messages for c1 mode
+ * src/SDCC.lex (checkCurrFile): test if fullSrcFileName is NULL for c1mode
+
2003-02-15 <johan@balder>
* src/asm.c: new options: --no-c-code-in-asm and --i-code-in-asm
2003-02-15 <johan@balder>
* src/asm.c: new options: --no-c-code-in-asm and --i-code-in-asm
\labelwidthstring 00.00.0000
\labelwidthstring 00.00.0000
+\series bold
+--c1mode
+\series default
+ reads the preprocessed source from standard input and compiles it.
+ The file name for the assembler output must be specified using the -o option.
+\layout List
+\labelwidthstring 00.00.0000
+
+
\series bold
-E
\series default
\series bold
-E
\series default
extern int lineno, column;
extern char *filename ;
extern int lineno, column;
extern char *filename ;
-extern char *fullSrcFileName ;
int yylineno = 1 ;
void count() ;
int process_pragma(char *);
int yylineno = 1 ;
void count() ;
int process_pragma(char *);
/* get the currentfile name info */
s++ ;
/* get the currentfile name info */
s++ ;
- if ( strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) {
+ /* in c1mode fullSrcFileName is NULL */
+ if ( fullSrcFileName &&
+ strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) {
lineno = yylineno = lNum;
currFname = fullSrcFileName ;
} else {
lineno = yylineno = lNum;
currFname = fullSrcFileName ;
} else {
/*-------------------------------------------------------------------------
/*-------------------------------------------------------------------------
- SDCCglue.h - glues everything we have done together into one file.
+ SDCCglue.h - glues everything we have done together into one file.
Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998)
Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998)
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding!
+ what you give them. Help stamp out software-hoarding!
-------------------------------------------------------------------------*/
#include "SDCCglobl.h"
#include "SDCCmem.h"
-------------------------------------------------------------------------*/
#include "SDCCglobl.h"
#include "SDCCmem.h"
extern symbol *interrupts[];
extern set *publics;
extern set *tmpfileSet;
extern symbol *interrupts[];
extern set *publics;
extern set *tmpfileSet;
+extern set *tmpfileNameSet;
void rm_tmpfiles (void);
int
void rm_tmpfiles (void);
int
FILE *srcFile; /* source file */
FILE *cdbFile = NULL; /* debugger information output file */
char *fullSrcFileName; /* full name for the source file; */
FILE *srcFile; /* source file */
FILE *cdbFile = NULL; /* debugger information output file */
char *fullSrcFileName; /* full name for the source file; */
- /* can be NULL while linking without compiling */
+ /* can be NULL while c1mode or linking without compiling */
char *fullDstFileName; /* full name for the output file; */
/* only given by -o, otherwise NULL */
char *dstFileName; /* destination file name without extension */
char *fullDstFileName; /* full name for the output file; */
/* only given by -o, otherwise NULL */
char *dstFileName; /* destination file name without extension */
int nlibPaths = 0;
char *relFiles[128];
int nrelFiles = 0;
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. */
/* uncomment JAMIN_DS390 to always override and use ds390 port
for mcs51 work. This is temporary, for compatibility testing. */
#define OPTION_NO_CCODE_IN_ASM "--no-c-code-in-asm"
#define OPTION_ICODE_IN_ASM "--i-code-in-asm"
#define OPTION_NO_CCODE_IN_ASM "--no-c-code-in-asm"
#define OPTION_ICODE_IN_ASM "--i-code-in-asm"
optionsTable[] = {
{ 'm', NULL, NULL, "Set the port to use e.g. -mz80." },
{ 'p', NULL, NULL, "Select port specific processor e.g. -mpic14 -p16f84" },
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" },
{ '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" },
{ '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, "--debug", &options.debug, "Enable debugging symbol output" },
{ 'v', OPTION_VERSION, NULL, "Display sdcc's version" },
{ 'E', "--preprocessonly", &preProcOnly, "Preprocess only, do not compile" },
{ 0, "--debug", &options.debug, "Enable debugging symbol output" },
{ 'v', OPTION_VERSION, NULL, "Display sdcc's version" },
{ '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, "--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" },
"Usage : sdcc [options] filename\n"
"Options :-\n"
);
"Usage : sdcc [options] filename\n"
"Options :-\n"
);
printOptions(optionsTable);
for (i = 0; i < NUM_PORTS; i++)
printOptions(optionsTable);
for (i = 0; i < NUM_PORTS; i++)
}
/* otherwise depending on the file type */
}
/* 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 */
{
/* source file name : not if we already have a
source file */
if (!port->parseOption (&argc, argv, &i))
{
if (!port->parseOption (&argc, argv, &i))
{
- /* no option must be a filename */
- 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)
{
/* if no dstFileName given with -o, we've to find one: */
if (!dstFileName)
{
static int
preProcess (char **envp)
{
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)
{
/* if using external stack define the macro */
if (options.useXstack)
if (preProcOnly)
{
if (fullDstFileName)
if (preProcOnly)
{
if (fullDstFileName)
preOutName = Safe_strdup (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 : "");
}
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");
if (options.verbose)
printf ("sdcc: Calling preprocessor...\n");
if (my_system (buffer))
{
if (my_system (buffer))
{
- // @FIX: Dario Vecchio 03-05-2001
- if (preOutName)
- {
- unlink (preOutName);
- Safe_free (preOutName);
- }
- // EndFix
- {
- 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);
ExePathList[0] = BINDIR;
}
ExePathList[0] = BINDIR;
}
{
/* Case 1 */
if (getenv (SDCCDIR_NAME) != NULL)
{
/* Case 1 */
if (getenv (SDCCDIR_NAME) != NULL)
setMainValue ("dstfilename", dstFileName);
setMainValue ("fullsrcfilename", fullSrcFileName ? fullSrcFileName : "fullsrcfilename");
setMainValue ("dstfilename", dstFileName);
setMainValue ("fullsrcfilename", fullSrcFileName ? fullSrcFileName : "fullsrcfilename");
if (options.cc_only && fullDstFileName)
/* compile + assemble and -o given: -o specifies name of object file */
{
if (options.cc_only && fullDstFileName)
/* compile + assemble and -o given: -o specifies name of object file */
{
parseCmdLine (argc, argv);
/* if no input then printUsage & exit */
parseCmdLine (argc, argv);
/* if no input then printUsage & exit */
- if ((!options.c1mode && !fullSrcFileName && !nrelFiles) ||
- (options.c1mode && !fullSrcFileName))
+ if (!options.c1mode && !fullSrcFileName && !nrelFiles)
{
printUsage ();
exit (0);
{
printUsage ();
exit (0);
initMem ();
port->finaliseOptions ();
initMem ();
port->finaliseOptions ();
+ if (fullSrcFileName || options.c1mode)
printf ("sdcc: Generating code...\n");
yyparse ();
printf ("sdcc: Generating code...\n");
yyparse ();
- // @FIX: Dario Vecchio 03-05-2001
- if (preOutName) {
- if (yyin && yyin != stdin)
- fclose (yyin);
- unlink (preOutName);
- Safe_free (preOutName);
- }
- // EndFix
- return 1;
closeDumpFiles();
if (cdbFile)
fclose (cdbFile);
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 &&
if (!options.cc_only &&
!fatalError &&
!noAssemble &&
"FATAL Compiler Internal Error in file '%s' line number '%d' : %s \n"
"Contact Author with source code" },
{ E_LVALUE_REQUIRED, ERROR_LEVEL_ERROR,
"FATAL Compiler Internal Error in file '%s' line number '%d' : %s \n"
"Contact Author with source code" },
{ E_LVALUE_REQUIRED, ERROR_LEVEL_ERROR,
- "'lvalue' required for '%s' operation ." },
+ "'lvalue' required for '%s' operation." },
{ E_TMPFILE_FAILED, ERROR_LEVEL_ERROR,
"Creation of temp file failed" },
{ E_FUNCTION_EXPECTED, ERROR_LEVEL_ERROR,
"called object is not a function" },
{ E_USING_ERROR, ERROR_LEVEL_ERROR,
{ E_TMPFILE_FAILED, ERROR_LEVEL_ERROR,
"Creation of temp file failed" },
{ E_FUNCTION_EXPECTED, ERROR_LEVEL_ERROR,
"called object is not a function" },
{ E_USING_ERROR, ERROR_LEVEL_ERROR,
- "'using', 'interrupt' or 'reentrant' must follow a function definiton .'%s'" },
+ "'using', 'interrupt' or 'reentrant' must follow a function definiton.'%s'" },
{ E_SFR_INIT, ERROR_LEVEL_ERROR,
"Absolute address & initial value both cannot be specified for\n"
" a 'sfr','sbit' storage class, initial value ignored '%s'" },
{ E_SFR_INIT, ERROR_LEVEL_ERROR,
"Absolute address & initial value both cannot be specified for\n"
" a 'sfr','sbit' storage class, initial value ignored '%s'" },
{ E_INT_REQD, ERROR_LEVEL_ERROR,
"type must be INT for bit field definition" },
{ E_BITFLD_SIZE, ERROR_LEVEL_ERROR,
{ E_INT_REQD, ERROR_LEVEL_ERROR,
"type must be INT for bit field definition" },
{ E_BITFLD_SIZE, ERROR_LEVEL_ERROR,
- "bit field size greater than 16 . assuming 16" },
+ "bit field size greater than 16. assuming 16" },
{ W_TRUNCATION, ERROR_LEVEL_WARNING,
"high order truncation might occur" },
{ E_CODE_WRITE, ERROR_LEVEL_ERROR,
{ W_TRUNCATION, ERROR_LEVEL_WARNING,
"high order truncation might occur" },
{ E_CODE_WRITE, ERROR_LEVEL_ERROR,
{ E_OP_UNKNOWN_SIZE, ERROR_LEVEL_ERROR,
"unknown size for operand" },
{ W_LONG_UNSUPPORTED, ERROR_LEVEL_WARNING,
{ E_OP_UNKNOWN_SIZE, ERROR_LEVEL_ERROR,
"unknown size for operand" },
{ W_LONG_UNSUPPORTED, ERROR_LEVEL_WARNING,
- "'%s' 'long' not supported , declared as 'int' ." },
+ "'%s' 'long' not supported , declared as 'int'." },
{ E_LITERAL_GENERIC, ERROR_LEVEL_ERROR,
//"illegal cast of LITERAL value to 'generic' pointer: assuming 'xdata' pointer" },
"illegal cast of LITERAL value to 'generic' pointer" },
{ E_LITERAL_GENERIC, ERROR_LEVEL_ERROR,
//"illegal cast of LITERAL value to 'generic' pointer: assuming 'xdata' pointer" },
"illegal cast of LITERAL value to 'generic' pointer" },
{ W_UNKNOWN_FEXT, ERROR_LEVEL_WARNING,
"don't know what to do with file '%s'. file extension unsupported" },
{ W_TOO_MANY_SRC, ERROR_LEVEL_WARNING,
{ W_UNKNOWN_FEXT, ERROR_LEVEL_WARNING,
"don't know what to do with file '%s'. file extension unsupported" },
{ W_TOO_MANY_SRC, ERROR_LEVEL_WARNING,
- "cannot compile more than one source file . file '%s' ignored" },
+ "cannot compile more than one source file. file '%s' ignored" },
{ I_CYCLOMATIC, ERROR_LEVEL_INFO,
"function '%s', # edges %d , # nodes %d , cyclomatic complexity %d" },
{ E_DIVIDE_BY_ZERO, ERROR_LEVEL_ERROR,
{ I_CYCLOMATIC, ERROR_LEVEL_INFO,
"function '%s', # edges %d , # nodes %d , cyclomatic complexity %d" },
{ E_DIVIDE_BY_ZERO, ERROR_LEVEL_ERROR,
"if-statement condition always true, if-statement not generated" },
{ E_PARAM_NAME_OMITTED, ERROR_LEVEL_ERROR,
"in function %s: name omitted for parameter %d" },
"if-statement condition always true, if-statement not generated" },
{ E_PARAM_NAME_OMITTED, ERROR_LEVEL_ERROR,
"in function %s: name omitted for parameter %d" },
+{ W_NO_FILE_ARG_IN_C1, ERROR_LEVEL_WARNING,
+ "only standard input is compiled in c1 mode. file '%s' ignored" },
+{ E_NEED_OPT_O_IN_C1, ERROR_LEVEL_ERROR,
+ "must specify assembler file name with -o in c1 mode" },
+{ W_ILLEGAL_OPT_COMBINATION, ERROR_LEVEL_WARNING,
+ "illegal combination of options (--c1mode, -E, -S -c)" },
#define W_CAST_STRUCT_PTR 157 /* pointer to different structure types */
#define W_IF_ALWAYS_TRUE 158
#define E_PARAM_NAME_OMITTED 159
#define W_CAST_STRUCT_PTR 157 /* pointer to different structure types */
#define W_IF_ALWAYS_TRUE 158
#define E_PARAM_NAME_OMITTED 159
+#define W_NO_FILE_ARG_IN_C1 160
+#define E_NEED_OPT_O_IN_C1 161
+#define W_ILLEGAL_OPT_COMBINATION 162
/** Describes the maximum error level that will be logged. Any level
* includes all of the levels listed after it.
/** Describes the maximum error level that will be logged. Any level
* includes all of the levels listed after it.