X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=704656eb518010f1f3e12b75cfed7ba4dce8ee6f;hb=d7b30120ae115e8929d57e25038ca76dde13974e;hp=199a7c06594809094ea04fea22bd10ae527f3e39;hpb=195ee3f3ee25ce2c5f2a59fbd2779c4cb80527c3;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 199a7c06..704656eb 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -91,7 +91,7 @@ DEFSETFUNC (rmTmpFiles) int ret; if (name) { - ret = unlink (name); + ret = remove (name); assert(ret == 0); Safe_free (name); } @@ -281,7 +281,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* if it has an initial value then do it only if it is a global variable */ if (sym->ival && sym->level == 0) { - if (SPEC_OCLS(sym->etype)==xidata) { + if ((SPEC_OCLS(sym->etype)==xidata) && !SPEC_ABSA (sym->etype)) { /* create a new "XINIT (CODE)" symbol, that will be emitted later in the static seg */ newSym=copySymbol (sym); @@ -309,8 +309,6 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) printIval (sym, sym->type, sym->ival, tmpFile); noAlloc--; } - - sym->ival=NULL; } else { if (IS_AGGREGATE (sym->type)) { ival = initAggregates (sym, sym->ival, NULL); @@ -338,12 +336,11 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) allocInfo = 1; } } - sym->ival = NULL; } /* if it has an absolute address then generate an equate for this no need to allocate space */ - if (SPEC_ABSA (sym->etype)) + if (SPEC_ABSA (sym->etype) && !sym->ival) { char *equ="="; if (options.debug) { @@ -360,22 +357,27 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) sym->rname, equ, SPEC_ADDR (sym->etype)); } - else { - int size = getAllocSize (sym->type); - if (size==0) { - werrorfl (sym->fileDef, sym->lineDef, E_UNKNOWN_SIZE, sym->name); - } - /* allocate space */ - if (options.debug) { - fprintf (map->oFile, "==.\n"); + else + { + int size = getSize (sym->type) + sym->flexArrayLength; + if (size==0) { + werrorfl (sym->fileDef, sym->lineDef, E_UNKNOWN_SIZE, sym->name); + } + /* allocate space */ + if (options.debug) { + fprintf (map->oFile, "==.\n"); + } + if (SPEC_ABSA (sym->etype)) + { + tfprintf (map->oFile, "\t!org\n", SPEC_ADDR (sym->etype)); + } + if (IS_STATIC (sym->etype) || sym->level) + tfprintf (map->oFile, "!slabeldef\n", sym->rname); + else + tfprintf (map->oFile, "!labeldef\n", sym->rname); + tfprintf (map->oFile, "\t!ds\n", (unsigned int) size & 0xffff); } - if (IS_STATIC (sym->etype)) - tfprintf (map->oFile, "!slabeldef\n", sym->rname); - else - tfprintf (map->oFile, "!labeldef\n", sym->rname); - tfprintf (map->oFile, "\t!ds\n", - (unsigned int) size & 0xffff); - } + sym->ival = NULL; } } @@ -430,7 +432,7 @@ initPointer (initList * ilist, sym_link *toType) if (IS_AST_OP (expr) && expr->opval.op == '&') { /* address of symbol */ if (IS_AST_SYM_VALUE (expr->left)) { - val = copyValue (AST_VALUE (expr->left)); + val = AST_VALUE (expr->left); val->type = newLink (DECLARATOR); if (SPEC_SCLS (expr->left->etype) == S_CODE) { DCL_TYPE (val->type) = CPOINTER; @@ -773,11 +775,16 @@ printIvalStruct (symbol * sym, sym_link * type, iloop = ilist->init.deep; } - for (; sflds; sflds = sflds->next, iloop = (iloop ? iloop->next : NULL)) { - if (IS_BITFIELD(sflds->type)) { - printIvalBitFields(&sflds,&iloop,oFile); - } else { - printIval (sym, sflds->type, iloop, oFile); + if (SPEC_STRUCT (type)->type == UNION) { + printIval (sym, sflds->type, iloop, oFile); + iloop = iloop->next; + } else { + for (; sflds; sflds = sflds->next, iloop = (iloop ? iloop->next : NULL)) { + if (IS_BITFIELD(sflds->type)) { + printIvalBitFields(&sflds,&iloop,oFile); + } else { + printIval (sym, sflds->type, iloop, oFile); + } } } if (iloop) { @@ -790,21 +797,29 @@ printIvalStruct (symbol * sym, sym_link * type, /* printIvalChar - generates initital value for character array */ /*-----------------------------------------------------------------*/ int -printIvalChar (sym_link * type, initList * ilist, FILE * oFile, char *s) +printIvalChar (symbol * sym, sym_link * type, initList * ilist, FILE * oFile, char *s) { value *val; + unsigned int size = DCL_ELEM (type); if (!s) { - val = list2val (ilist); /* if the value is a character string */ if (IS_ARRAY (val->type) && IS_CHAR (val->etype)) { - if (!DCL_ELEM (type)) - DCL_ELEM (type) = strlen (SPEC_CVAL (val->etype).v_char) + 1; + if (!size) + { + /* we have not been given a size, but now we know it */ + size = strlen (SPEC_CVAL (val->etype).v_char) + 1; + /* but first check, if it's a flexible array */ + if (sym && IS_STRUCT (sym->type)) + sym->flexArrayLength = size; + else + DCL_ELEM (type) = size; + } - printChar (oFile, SPEC_CVAL (val->etype).v_char, DCL_ELEM (type)); + printChar (oFile, SPEC_CVAL (val->etype).v_char, size); return 1; } @@ -823,6 +838,7 @@ void printIvalArray (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) { + value *val; initList *iloop; unsigned int size = 0; @@ -831,11 +847,16 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, /* array of characters can be init */ /* by a string */ if (IS_CHAR (type->next)) { - if (!IS_LITERAL(list2val(ilist)->etype)) { + val = list2val(ilist); + if (!val) { + werrorfl (ilist->filename, ilist->lineno, E_INIT_STRUCT, sym->name); + return; + } + if (!IS_LITERAL(val->etype)) { werrorfl (ilist->filename, ilist->lineno, E_CONST_EXPECTED); return; } - if (printIvalChar (type, + if (printIvalChar (sym, type, (ilist->type == INIT_DEEP ? ilist->init.deep : ilist), oFile, SPEC_CVAL (sym->etype).v_char)) return; @@ -864,8 +885,12 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, } } } else { - // we have not been given a size, but we now know it - DCL_ELEM (type) = size; + /* we have not been given a size, but now we know it */ + /* but first check, if it's a flexible array */ + if (IS_STRUCT (sym->type)) + sym->flexArrayLength = size * getSize (type->next); + else + DCL_ELEM (type) = size; } return; @@ -1229,8 +1254,7 @@ emitStaticSeg (memmap * map, FILE * out) if (IS_EXTERN (sym->etype)) continue; - /* if it is not static add it to the public - table */ + /* if it is not static add it to the public table */ if (!IS_STATIC (sym->etype)) { addSetHead (&publics, sym); @@ -1253,8 +1277,8 @@ emitStaticSeg (memmap * map, FILE * out) fprintf (out, "%s$%d$%d", sym->name, sym->level, sym->block); } - /* if it has an absolute address */ - if (SPEC_ABSA (sym->etype)) + /* if it has an absolute address and no initializer */ + if (SPEC_ABSA (sym->etype) && !sym->ival) { if (options.debug) fprintf (out, " == 0x%04x\n", SPEC_ADDR (sym->etype)); @@ -1271,6 +1295,10 @@ emitStaticSeg (memmap * map, FILE * out) /* if it has an initial value */ if (sym->ival) { + if (SPEC_ABSA (sym->etype)) + { + tfprintf (out, "\t!org\n", SPEC_ADDR (sym->etype)); + } fprintf (out, "%s:\n", sym->rname); noAlloc++; resolveIvalSym (sym->ival, sym->type); @@ -1319,6 +1347,8 @@ emitMaps (void) data, idata & bit & xdata */ emitRegularMap (data, TRUE, TRUE); emitRegularMap (idata, TRUE, TRUE); + emitRegularMap (d_abs, TRUE, TRUE); + emitRegularMap (i_abs, TRUE, TRUE); emitRegularMap (bit, TRUE, TRUE); emitRegularMap (pdata, TRUE, TRUE); emitRegularMap (xdata, TRUE, TRUE); @@ -1338,6 +1368,8 @@ emitMaps (void) tfprintf (code->oFile, "\t!area\n", xinit->sname); emitStaticSeg (xinit, code->oFile); } + tfprintf (code->oFile, "\t!area\n", c_abs->sname); + emitStaticSeg (c_abs, code->oFile); inInitMode--; } @@ -1764,6 +1796,15 @@ glue (void) copyFile (asmFile, idata->oFile); } + /* create the absolute idata/data segment */ + if ( (i_abs) && (mcs51_like) ) { + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; absolute internal ram data\n"); + fprintf (asmFile, "%s", iComments2); + copyFile (asmFile, d_abs->oFile); + copyFile (asmFile, i_abs->oFile); + } + /* copy the bit segment */ if (mcs51_like) { fprintf (asmFile, "%s", iComments2); @@ -1902,7 +1943,6 @@ glue (void) if (mainf && IFFUNC_HASBODY(mainf->type)) { - /* entry point @ start of HOME */ fprintf (asmFile, "__sdcc_program_startup:\n"); @@ -1938,7 +1978,7 @@ glue (void) /** Creates a temporary file with unique file name Scans, in order: - TMP, TEMP, TMPDIR env. variables - - if Un*x system: /usr/tmp and /tmp + - if Un*x system: /tmp and /var/tmp - root directory using mkstemp() if available - default location using tempnam() */ @@ -1971,14 +2011,14 @@ tempfileandname(char *fname, size_t len) } #else { - /* try with /usr/tmp and /tmp on Un*x systems */ + /* try with /tmp and /var/tmp on Un*x systems */ struct stat statbuf; if (tmpdir == NULL) { - if (stat("/usr/tmp", &statbuf) != -1) - tmpdir = "/usr/tmp"; - else if (stat("/tmp", &statbuf) != -1) + if (stat("/tmp", &statbuf) != -1) tmpdir = "/tmp"; + else if (stat("/var/tmp", &statbuf) != -1) + tmpdir = "/var/tmp"; } } #endif