X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCmain.c;h=baed73f45a9296a14cdd84d08e17e2feaf59bdb2;hb=493fa3118ec8e61be835bdffbf11a5494d9fab18;hp=3573c6bb7aafb34d3ee83421bb5f0dd6311bb7cb;hpb=a459416b8ccfbc72b21ea4053f68bf2c69a747e2;p=fw%2Fsdcc diff --git a/src/SDCCmain.c b/src/SDCCmain.c index 3573c6bb..baed73f4 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -79,8 +79,8 @@ int ds390_jammed = 0; #endif // Globally accessible scratch buffer for file names. -char scratchFileName[FILENAME_MAX]; -char buffer[FILENAME_MAX]; +char scratchFileName[PATH_MAX]; +char buffer[PATH_MAX]; // In MSC VC6 default search path for exe's to path for this @@ -146,7 +146,7 @@ optionsTable[] = { { 'M', NULL, NULL, "Preprocessor option" }, { 'V', NULL, &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 assembler (a) or linker (l)" }, + { '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" }, { 'l', NULL, NULL, "Include the given library in the link" }, { 0, OPTION_LARGE_MODEL, NULL, "external data space is used" }, @@ -171,6 +171,7 @@ optionsTable[] = { { 0, "--dumpliverange", &options.dump_range, NULL }, { 0, "--dumpregpack", &options.dump_pack, NULL }, { 0, "--dumpregassign", &options.dump_rassgn, 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, " External Ram start location" }, { 0, OPTION_IRAM_SIZE, NULL, " Internal Ram size" }, @@ -203,7 +204,9 @@ optionsTable[] = { { 0, "--verbose", &options.verbose, "Trace calls to the preprocessor, assembler, and linker" }, { 0, OPTION_LESS_PEDANTIC, NULL, "Disable some of the more pedantic warnings" }, { 0, OPTION_SHORT_IS_8BITS, NULL, "Make short 8bits (for old times sake)" }, - { 0, "--profile", &options.profile, "On supported ports, generate extra profiling information" } + { 0, "--profile", &options.profile, "On supported ports, generate extra profiling information" }, + { 0, "--fommit-frame-pointer", &options.ommitFramePtr, "Leave out the frame pointer." }, + { 0, "--use-accelerator", &options.useAccelerator,"generate code for DS390 Arithmetic Accelerator"} }; /** Table of all unsupported options and help text to display when one @@ -502,14 +505,14 @@ processFile (char *s) { werror (E_FILE_OPEN_ERR, s); exit (1); - } + } /* copy the file name into the buffer */ strcpy (buffer, s); /* get rid of the "." */ strtok (buffer, "."); - srcFileName = Safe_calloc (1, strlen (buffer) + 1); + srcFileName = Safe_alloc ( strlen (buffer) + 1); strcpy (srcFileName, buffer); /* get rid of any path information @@ -522,7 +525,7 @@ processFile (char *s) *(fext - 1) != '/' && *(fext - 1) != ':') fext--; - moduleName = Safe_calloc (1, strlen (fext) + 1); + moduleName = Safe_alloc ( strlen (fext) + 1); strcpy (moduleName, fext); return; @@ -559,7 +562,7 @@ _processC1Arg (char *s) werror (W_TOO_MANY_SRC, s); return; } - options.out_name = strdup (s); + options.out_name = Safe_strdup (s); } else { @@ -933,23 +936,25 @@ parseCmdLine (int argc, char **argv) break; case 'W': + /* pre-processer options */ + if (argv[i][2] == 'p') + { + parseWithComma ((char **)preArgv, getStringArg("-Wp", argv, &i, argc)); + } /* linker options */ - if (argv[i][2] == 'l') - { - parseWithComma(linkOptions, getStringArg("-Wl", argv, &i, argc)); - } - else + else if (argv[i][2] == 'l') { - /* assembler options */ - if (argv[i][2] == 'a') - { - parseWithComma ((char **) asmOptions, getStringArg("-Wa", argv, &i, argc)); - } - else - { - werror (W_UNKNOWN_OPTION, argv[i]); - } + parseWithComma(linkOptions, getStringArg("-Wl", argv, &i, argc)); } + /* assembler options */ + else if (argv[i][2] == 'a') + { + parseWithComma ((char **) asmOptions, getStringArg("-Wa", argv, &i, argc)); + } + else + { + werror (W_UNKNOWN_OPTION, argv[i]); + } break; case 'v': @@ -1073,10 +1078,10 @@ linkEdit (char **envp) fprintf (lnkfile, "-z\n"); #define WRITE_SEG_LOC(N, L) \ - segName = strdup(N); \ + segName = Safe_strdup(N); \ c = strtok(segName, " \t"); \ fprintf (lnkfile,"-b %s = 0x%04x\n", c, L); \ - if (segName) { free(segName); } + if (segName) { Safe_free(segName); } /* code segment start */ WRITE_SEG_LOC (CODE_NAME, options.code_loc); @@ -1130,7 +1135,7 @@ linkEdit (char **envp) break; } } - fprintf (lnkfile, "-k %s/%s\n", SDCC_LIB_DIR /*STD_LIB_PATH */ , c); + mfprintf (lnkfile, getRuntimeVariables(), "-k {libdir}{sep}%s\n", c); /* standard library files */ /* if (strcmp (port->target, "ds390") == 0) */ @@ -1163,7 +1168,9 @@ linkEdit (char **envp) if (port->linker.cmd) { - buildCmdLine (buffer, port->linker.cmd, srcFileName, NULL, NULL, NULL); + char buffer2[PATH_MAX]; + buildCmdLine (buffer2, port->linker.cmd, srcFileName, NULL, NULL, NULL); + buildCmdLine2 (buffer, buffer2); } else { @@ -1178,7 +1185,7 @@ linkEdit (char **envp) if (strcmp (srcFileName, "temp") == 0) { /* rename "temp.cdb" to "firstRelFile.cdb" */ - char *f = strtok (strdup (relFiles[0]), "."); + char *f = strtok (Safe_strdup (relFiles[0]), "."); f = strcat (f, ".cdb"); rename ("temp.cdb", f); srcFileName = NULL; @@ -1193,7 +1200,9 @@ assemble (char **envp) { if (port->assembler.cmd) { - buildCmdLine (buffer, port->assembler.cmd, srcFileName, NULL, NULL, asmOptions); + buildCmdLine (buffer, port->assembler.cmd, srcFileName, NULL, + options.debug ? port->assembler.debug_opts : port->assembler.plain_opts, + asmOptions); } else { @@ -1231,6 +1240,10 @@ preProcess (char **envp) if (options.stack10bit) addToList (preArgv, "-DSDCC_STACK_TENBIT"); + /* set the macro for no overlay */ + if (options.noOverlay) + addToList (preArgv, "-DSDCC_NOOVERLAY"); + /* set the macro for large model */ switch (options.model) { @@ -1266,10 +1279,11 @@ preProcess (char **envp) setMainValue ("cppextraopts", join(preArgv)); if (!preProcOnly) - preOutName = strdup (tmpnam (NULL)); - - setMainValue ("cppoutfilename", preOutName); + preOutName = Safe_strdup (tempfilename ()); + /* Have to set cppoutfilename to something, even if just pre-processing. */ + setMainValue ("cppoutfilename", preOutName ? preOutName : ""); + if (options.verbose) printf ("sdcc: Calling preprocessor...\n"); @@ -1281,7 +1295,7 @@ preProcess (char **envp) if (preOutName) { unlink (preOutName); - free (preOutName); + Safe_free (preOutName); } // EndFix exit (1); @@ -1315,7 +1329,7 @@ _setPaths (const char *pprefix) configure time, see if the library and include directories are where expected. If so, set. */ - getStringDifference (buffer, PREFIX, SDCC_INCLUDE_DIR); + getPathDifference (buffer, PREFIX, SDCC_INCLUDE_DIR); strcpy (scratchFileName, pprefix); strcat (scratchFileName, buffer); @@ -1328,7 +1342,7 @@ _setPaths (const char *pprefix) return FALSE; } - getStringDifference (buffer, PREFIX, SDCC_LIB_DIR); + getPathDifference (buffer, PREFIX, SDCC_LIB_DIR); strcpy (scratchFileName, pprefix); strcat (scratchFileName, buffer); @@ -1377,15 +1391,15 @@ _discoverPaths (const char *argv0) strcpy (scratchFileName, argv0); *strrchr (scratchFileName, DIR_SEPARATOR_CHAR) = '\0'; setMainValue ("bindir", scratchFileName); - ExePathList[0] = gc_strdup (scratchFileName); + ExePathList[0] = Safe_strdup (scratchFileName); } else if (getenv (SDCCDIR_NAME) != NULL) { - getStringDifference (buffer, PREFIX, BINDIR); + getPathDifference (buffer, PREFIX, BINDIR); strcpy (scratchFileName, getenv (SDCCDIR_NAME)); strcat (scratchFileName, buffer); setMainValue ("bindir", scratchFileName); - ExePathList[0] = gc_strdup (scratchFileName); + ExePathList[0] = Safe_strdup (scratchFileName); } else { @@ -1405,7 +1419,7 @@ _discoverPaths (const char *argv0) } else { - /* Include and lib wern't where expected. */ + /* Include and lib weren't where expected. */ } } /* Case 2 */ @@ -1441,10 +1455,11 @@ initValues (void) { populateMainValues (_baseValues); setMainValue ("port", port->target); - setMainValue ("fullsrcfilename", fullSrcFileName); - setMainValue ("srcfilename", srcFileName); setMainValue ("objext", port->linker.rel_ext); setMainValue ("asmext", port->assembler.file_ext); + + setMainValue ("fullsrcfilename", fullSrcFileName ? fullSrcFileName : "fullsrcfilename"); + setMainValue ("srcfilename", srcFileName ? srcFileName : "srcfilename"); } /* @@ -1497,11 +1512,11 @@ main (int argc, char **argv, char **envp) exit (0); } + initValues (); + _discoverPaths (argv[0]); + if (srcFileName) { - initValues (); - _discoverPaths (argv[0]); - preProcess (envp); initMem (); @@ -1541,7 +1556,7 @@ main (int argc, char **argv, char **envp) if (yyin && yyin != stdin) fclose (yyin); unlink (preOutName); - free (preOutName); + Safe_free (preOutName); } // EndFix return 1; @@ -1561,7 +1576,7 @@ main (int argc, char **argv, char **envp) if (yyin && yyin != stdin) fclose (yyin); unlink (preOutName); - free (preOutName); + Safe_free (preOutName); } // EndFix #if defined (__MINGW32__) || defined (__CYGWIN__) || defined (_MSC_VER) @@ -1580,7 +1595,7 @@ main (int argc, char **argv, char **envp) if (preOutName && !options.c1mode) { unlink (preOutName); - free (preOutName); + Safe_free (preOutName); } if (!options.cc_only &&