X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=55487f379a1f6eb8939a46db25137c7f9423230a;hb=e38cbca7359a22dc69b88a286965b4d7ead3ce17;hp=b75c37ba866a17917f63f9fd270a8012856aeeca;hpb=558f8ebc97656d7645b4a0a43f2be2d7226bc57c;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index b75c37ba..55487f37 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -70,7 +70,7 @@ DEFSETFUNC (rmTmpFiles) if (name) { unlink (name); - free (name); + Safe_free (name); } return 0; } @@ -99,6 +99,11 @@ aopLiteralLong (value * val, int offset, int size) } fl; + if (!val) { + // assuming we have been warned before + val=constVal("0"); + } + /* if it is a float then it gets tricky */ /* otherwise it is fairly simple */ if (!IS_FLOAT (val->type)) { @@ -181,18 +186,25 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* if allocation required check is needed then check if the symbol really requires allocation only for local variables */ + if (arFlag && !IS_AGGREGATE (sym->type) && !(sym->_isparm && !IS_REGPARM (sym->etype)) && !sym->allocreq && sym->level) continue; + /* for bitvar locals and parameters */ + if (!arFlag && !sym->allocreq && sym->level + && !SPEC_ABSA (sym->etype)) { + continue; + } + /* if global variable & not static or extern and addPublics allowed then add it to the public set */ if ((sym->level == 0 || (sym->_isparm && !IS_REGPARM (sym->etype))) && addPublics && !IS_STATIC (sym->etype) && - (IS_FUNC(sym->type) ? (sym->used || sym->fbody) : 1)) + (IS_FUNC(sym->type) ? (sym->used || IFFUNC_HASBODY(sym->type)) : 1)) { addSetHead (&publics, sym); } @@ -262,12 +274,14 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* if the ival is a symbol assigned to an aggregate, (bug #458099 -> #462479) we don't need it anymore, so delete it from its segment */ - if (IS_AST_SYM_VALUE(sym->ival->init.node) && + if (sym->ival->type == INIT_NODE && + IS_AST_SYM_VALUE(sym->ival->init.node) && IS_AGGREGATE (sym->type) ) { symIval=AST_SYMBOL(sym->ival->init.node); segment = SPEC_OCLS (symIval->etype); deleteSetItem (&segment->syms, symIval); } + sym->ival = NULL; } } @@ -1091,7 +1105,7 @@ createInterruptVect (FILE * vFile) } /* if the main is only a prototype ie. no body then do nothing */ - if (!mainf->fbody) + if (!IFFUNC_HASBODY(mainf->type)) { /* if ! compile only then main function should be present */ if (!options.cc_only && !noAssemble) @@ -1375,7 +1389,7 @@ glue () copyFile (asmFile, ovrFile); /* create the stack segment MOF */ - if (mainf && mainf->fbody) + if (mainf && IFFUNC_HASBODY(mainf->type)) { fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; Stack segment in internal ram \n"); @@ -1397,7 +1411,7 @@ glue () copyFile (asmFile, bit->oFile); /* if external stack then reserve space of it */ - if (mainf && mainf->fbody && options.useXstack) + if (mainf && IFFUNC_HASBODY(mainf->type) && options.useXstack) { fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; external stack \n"); @@ -1414,7 +1428,7 @@ glue () copyFile (asmFile, xdata->oFile); /* copy the interrupt vector table */ - if (mainf && mainf->fbody) + if (mainf && IFFUNC_HASBODY(mainf->type)) { fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; interrupt vector \n"); @@ -1437,7 +1451,7 @@ glue () tfprintf (asmFile, "\t!area\n", port->mem.post_static_name); tfprintf (asmFile, "\t!area\n", port->mem.static_name); - if (mainf && mainf->fbody) + if (mainf && IFFUNC_HASBODY(mainf->type)) { fprintf (asmFile, "__sdcc_gsinit_startup:\n"); /* if external stack is specified then the @@ -1472,7 +1486,7 @@ glue () } copyFile (asmFile, statsg->oFile); - if (port->general.glue_up_main && mainf && mainf->fbody) + if (port->general.glue_up_main && mainf && IFFUNC_HASBODY(mainf->type)) { /* This code is generated in the post-static area. * This area is guaranteed to follow the static area @@ -1494,7 +1508,7 @@ glue () fprintf (asmFile, "; code\n"); fprintf (asmFile, "%s", iComments2); tfprintf (asmFile, "\t!areacode\n", CODE_NAME); - if (mainf && mainf->fbody) + if (mainf && IFFUNC_HASBODY(mainf->type)) { /* entry point @ start of CSEG */ @@ -1532,6 +1546,33 @@ rm_tmpfiles (void) } #endif +/** Creates a temporary file name a'la tmpnam which avoids the bugs + in cygwin wrt c:\tmp. + Scans, in order: TMP, TEMP, TMPDIR, else uses tmpfile(). +*/ +char * +tempfilename (void) +{ +#if !defined(_MSC_VER) + const char *tmpdir = NULL; + if (getenv ("TMP")) + tmpdir = getenv ("TMP"); + else if (getenv ("TEMP")) + tmpdir = getenv ("TEMP"); + else if (getenv ("TMPDIR")) + tmpdir = getenv ("TMPDIR"); + if (tmpdir) + { + char *name = tempnam (tmpdir, "sdcc"); + if (name) + { + return name; + } + } +#endif + return tmpnam (NULL); +} + /** Creates a temporary file a'la tmpfile which avoids the bugs in cygwin wrt c:\tmp. Scans, in order: TMP, TEMP, TMPDIR, else uses tmpfile(). @@ -1549,7 +1590,7 @@ tempfile (void) tmpdir = getenv ("TMPDIR"); if (tmpdir) { - char *name = tempnam (tmpdir, "sdcc"); + char *name = Safe_strdup( tempnam (tmpdir, "sdcc")); if (name) { FILE *fp = fopen (name, "w+b"); @@ -1565,11 +1606,3 @@ tempfile (void) return tmpfile (); } -char * -gc_strdup (const char *s) -{ - char *ret; - ret = Safe_calloc (1, strlen (s) + 1); - strcpy (ret, s); - return ret; -}