X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=3b329f912c3d6d5b4d70c21a47b21813074fd947;hb=57b5edb25dcb2872d2c3e9789173bc9423959bec;hp=475920045cd3897cbd6e65ec7e3e3cc2ae11b26b;hpb=335e716901410667443532196789fb96107fd49b;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 47592004..3b329f91 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -31,15 +31,18 @@ symbol *interrupts[256]; void printIval (symbol *, link *, initList *, FILE *); extern int noAlloc; set *publics = NULL; /* public variables */ +set *externs = NULL; /* Varibles that are declared as extern */ /* TODO: this should be configurable (DS803C90 uses more than 6) */ int maxInterrupts = 6; +int allocInfo = 1; extern int maxRegBank ; symbol *mainf; extern char *VersionString; extern FILE *codeOutFile; set *tmpfileSet = NULL; /* set of tmp file created by the compiler */ set *tmpfileNameSet = NULL; /* All are unlinked at close. */ + /*-----------------------------------------------------------------*/ /* closeTmpFiles - closes all tmp files created by the compiler */ /* because of BRAIN DEAD MS/DOS & CYGNUS Libraries */ @@ -142,8 +145,12 @@ static void emitRegularMap (memmap * map, bool addPublics, bool arFlag) if (addPublics) { /* PENDING: special case here - should remove */ - if (!strcmp(map->sname, DATA_NAME)) + if (!strcmp(map->sname, CODE_NAME)) + tfprintf(map->oFile, "\t!areacode\n", map->sname); + else if (!strcmp(map->sname, DATA_NAME)) tfprintf(map->oFile, "\t!areadata\n", map->sname); + else if (!strcmp(map->sname, HOME_NAME)) + tfprintf(map->oFile, "\t!areahome\n", map->sname); else tfprintf(map->oFile, "\t!area\n", map->sname); } @@ -152,9 +159,11 @@ static void emitRegularMap (memmap * map, bool addPublics, bool arFlag) for (sym = setFirstItem (map->syms); sym; sym = setNextItem (map->syms)) { - /* if extern then do nothing */ - if (IS_EXTERN (sym->etype)) + /* if extern then add it into the extern list */ + if (IS_EXTERN (sym->etype)) { + addSetHead (&externs, sym); continue; + } /* if allocation required check is needed then check if the symbol really requires @@ -169,8 +178,10 @@ static void emitRegularMap (memmap * map, bool addPublics, bool arFlag) if ((sym->level == 0 || (sym->_isparm && !IS_REGPARM(sym->etype))) && addPublics && - !IS_STATIC (sym->etype)) + !IS_STATIC (sym->etype) && + (sym->used || sym->fbody)) { addSetHead (&publics, sym); + } /* if extern then do nothing or is a function then do nothing */ @@ -207,7 +218,10 @@ static void emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* allocate space */ if ((options.debug || sym->level == 0) && !options.nodebug) fprintf(map->oFile,"==.\n"); - tfprintf(map->oFile, "!labeldef\n", sym->rname); + 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)getSize (sym->type) & 0xffff); } @@ -222,13 +236,14 @@ static void emitRegularMap (memmap * map, bool addPublics, bool arFlag) ival = newNode ('=', newAst (EX_VALUE, symbolVal (sym)), decorateType (resolveSymbols (list2expr (sym->ival)))); codeOutFile = statsg->oFile; + allocInfo = 0; eBBlockFromiCode (iCodeFromAst (ival)); + allocInfo = 1; sym->ival = NULL; } } } - /*-----------------------------------------------------------------*/ /* initPointer - pointer initialization code massaging */ /*-----------------------------------------------------------------*/ @@ -293,7 +308,21 @@ value *initPointer (initList *ilist) expr->left->opval.op == PTR_OP && IS_ADDRESS_OF_OP(expr->left->left)) return valForStructElem(expr->left->left->left, - expr->left->right); + expr->left->right); + + } + /* case 3. (((char *) &a) +/- constant) */ + if (IS_AST_OP(expr) && + (expr->opval.op == '+' || expr->opval.op == '-') && + IS_AST_OP(expr->left) && expr->left->opval.op == CAST && + IS_AST_OP(expr->left->right) && + expr->left->right->opval.op == '&' && + IS_AST_LIT_VALUE(expr->right)) { + + return valForCastAggr(expr->left->right->left, + expr->left->left->opval.lnk, + expr->right,expr->opval.op); + } wrong: @@ -320,7 +349,7 @@ void printChar (FILE * ofile, char *s, int plen) *p = '\0'; if (p != buf) tfprintf(ofile, "\t!ascii\n", buf); - tfprintf(ofile, "\t!db\n", *s); + tfprintf(ofile, "\t!db !constbyte\n", *s); p = buf; } else { @@ -334,6 +363,7 @@ void printChar (FILE * ofile, char *s, int plen) if (p != buf) { *p = '\0'; tfprintf(ofile, "\t!ascii\n", buf); + p = buf; } if (len > 60) @@ -341,7 +371,7 @@ void printChar (FILE * ofile, char *s, int plen) else len = 0; } - tfprintf(ofile, "\t!db\n", 0); + tfprintf(ofile, "\t!db !constbyte\n", 0); } /*-----------------------------------------------------------------*/ @@ -359,19 +389,22 @@ void printIvalType (link * type, initList * ilist, FILE * oFile) switch (getSize (type)) { case 1: if (!val) - tfprintf(oFile, "\t!db\n", 0); + tfprintf(oFile, "\t!db !constbyte\n", 0); else tfprintf(oFile, "\t!dbs\n", aopLiteral (val, 0)); break; case 2: - tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, 2)); + if (port->use_dw_for_init) + tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, 2)); + else + fprintf(oFile, "\t.byte %s,%s\n", aopLiteral(val, 0),aopLiteral(val, 1)); break; case 4: if (!val) { - tfprintf (oFile, "\t!dw\n", 0); - tfprintf (oFile, "\t!dw\n", 0); + tfprintf (oFile, "\t!dw !constword\n", 0); + tfprintf (oFile, "\t!dw !constword\n", 0); } else { fprintf (oFile, "\t.byte %s,%s,%s,%s\n", @@ -429,7 +462,7 @@ int printIvalChar (link * type, initList * ilist, FILE * oFile, char *s) if ((remain = (DCL_ELEM (type) - strlen (SPEC_CVAL (val->etype).v_char) -1))>0) while (remain--) - tfprintf (oFile, "\t!db\n", 0); + tfprintf (oFile, "\t!db !constbyte\n", 0); return 1; } @@ -503,19 +536,22 @@ void printIvalFuncPtr (link * type, initList * ilist, FILE * oFile) val = list2val (ilist); /* check the types */ if ((dLvl = checkType (val->type, type->next)) <= 0) { - tfprintf(oFile, "\t!dw\n", 0); + tfprintf(oFile, "\t!dw !constword\n", 0); return; } /* now generate the name */ if (!val->sym) { - if (IS_LITERAL (val->etype)) - tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, 2)); - else + if (port->use_dw_for_init) tfprintf(oFile, "\t!dws\n", val->name); + else + fprintf(oFile, "\t.byte %s,(%s >> 8)\n", val->name,val->name); } - else - tfprintf(oFile, "\t!dws\n", val->sym->rname); + else + if (port->use_dw_for_init) + tfprintf(oFile, "\t!dws\n", val->sym->rname); + else + fprintf(oFile, "\t.byte %s,(%s >> 8)\n", val->sym->rname,val->sym->rname); return; } @@ -540,14 +576,18 @@ int printIvalCharPtr (symbol * sym, link * type, value * val, FILE * oFile) "\t!dbs\n", val->name) ; break; case 2: - tfprintf(oFile, "\t!dws\n", val->name); + if (port->use_dw_for_init) + tfprintf(oFile, "\t!dws\n", val->name); + else + fprintf(oFile, "\t.byte %s,(%s >> 8)\n", val->name, val->name); break; /* PENDING: probably just 3 */ default: /* PENDING: 0x02 or 0x%02x, CDATA? */ fprintf (oFile, - "\t.byte %s,(%s >> 8),#0x02\n", - val->name, val->name); + "\t.byte %s,(%s >> 8),#0x%02x\n", + val->name, val->name, (IS_PTR(val->type) ? DCL_TYPE(val->type) : + PTR_TYPE(SPEC_OCLS(val->etype)))); } } else { @@ -556,12 +596,15 @@ int printIvalCharPtr (symbol * sym, link * type, value * val, FILE * oFile) tfprintf(oFile, "\t!dbs\n", aopLiteral(val, 0)); break; case 2: - tfprintf(oFile, "\t!dws\n", - aopLiteralLong(val, 0, 2)); + if (port->use_dw_for_init) + tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, size)); + else + tfprintf(oFile, "\t.byte %s,%s\n", + aopLiteral(val, 0),aopLiteral(val, 1)); break; case 3: /* PENDING: 0x02 or 0x%02x, CDATA? */ - fprintf(oFile, "\t.byte %s,%s,0x02\n", + fprintf(oFile, "\t.byte %s,%s,#0x02\n", aopLiteral (val, 0), aopLiteral (val, 1)); break; default: @@ -609,14 +652,17 @@ void printIvalPtr (symbol * sym, link * type, initList * ilist, FILE * oFile) if (IS_LITERAL (val->etype)) { switch (getSize (type)) { case 1: - tfprintf(oFile, "\t!db\n", (unsigned int)floatFromVal(val) & 0xff); + tfprintf(oFile, "\t!db !constbyte\n", (unsigned int)floatFromVal(val) & 0xff); break; case 2: - tfprintf (oFile, "\t!dws\n", aopLiteralLong(val, 0, 2)); + if (port->use_dw_for_init) + tfprintf(oFile, "\t!dws\n", aopLiteralLong(val, 0, 2)); + else + tfprintf (oFile, "\t.byte %s,%s\n", aopLiteral(val, 0),aopLiteral(val, 1)); break; case 3: - fprintf (oFile, "\t.byte %s,%s,0x%02x\n", - aopLiteral (val, 0), aopLiteral (val, 1), CPOINTER); + fprintf (oFile, "\t.byte %s,%s,#0x02\n", + aopLiteral (val, 0), aopLiteral (val, 1)); } return; } @@ -631,8 +677,9 @@ void printIvalPtr (symbol * sym, link * type, initList * ilist, FILE * oFile) break; case 3: - fprintf (oFile, "\t.byte %s,(%s >> 8),0x%02x\n", - val->name, val->name, DCL_TYPE(val->type)); + fprintf (oFile, "\t.byte %s,(%s >> 8),#0x%02x\n", + val->name, val->name,(IS_PTR(val->type) ? DCL_TYPE(val->type) : + PTR_TYPE(SPEC_OCLS(val->etype)))); } return; } @@ -673,13 +720,14 @@ void printIval (symbol * sym, link * type, initList * ilist, FILE * oFile) /*-----------------------------------------------------------------*/ /* emitStaticSeg - emitcode for the static segment */ /*-----------------------------------------------------------------*/ -void emitStaticSeg (memmap * map) +void emitStaticSeg(memmap * map, FILE *out) { symbol *sym; /* fprintf(map->oFile,"\t.area\t%s\n",map->sname); */ - - + if (!out) + out = code->oFile; + /* for all variables in this segment do */ for (sym = setFirstItem (map->syms); sym; sym = setNextItem (map->syms)) { @@ -700,49 +748,49 @@ void emitStaticSeg (memmap * map) if (!sym->level) { /* global */ if (IS_STATIC(sym->etype)) - fprintf(code->oFile,"F%s$",moduleName); /* scope is file */ + fprintf(out,"F%s$",moduleName); /* scope is file */ else - fprintf(code->oFile,"G$"); /* scope is global */ + fprintf(out,"G$"); /* scope is global */ } else /* symbol is local */ - fprintf(code->oFile,"L%s$", + fprintf(out,"L%s$", (sym->localof ? sym->localof->name : "-null-")); - fprintf(code->oFile,"%s$%d$%d",sym->name,sym->level,sym->block); + fprintf(out,"%s$%d$%d",sym->name,sym->level,sym->block); } /* if it has an absolute address */ if (SPEC_ABSA (sym->etype)) { if ((options.debug || sym->level == 0) && !options.nodebug) - fprintf(code->oFile," == 0x%04x\n", SPEC_ADDR (sym->etype)); + fprintf(out," == 0x%04x\n", SPEC_ADDR (sym->etype)); - fprintf (code->oFile, "%s\t=\t0x%04x\n", + fprintf (out, "%s\t=\t0x%04x\n", sym->rname, SPEC_ADDR (sym->etype)); } else { if ((options.debug || sym->level == 0) && !options.nodebug) - fprintf(code->oFile," == .\n"); + fprintf(out," == .\n"); /* if it has an initial value */ if (sym->ival) { - fprintf (code->oFile, "%s:\n", sym->rname); + fprintf (out, "%s:\n", sym->rname); noAlloc++; resolveIvalSym (sym->ival); - printIval (sym, sym->type, sym->ival, code->oFile); + printIval (sym, sym->type, sym->ival, out); noAlloc--; } else { /* allocate space */ - fprintf (code->oFile, "%s:\n", sym->rname); + fprintf (out, "%s:\n", sym->rname); /* special case for character strings */ if (IS_ARRAY (sym->type) && IS_CHAR (sym->type->next) && SPEC_CVAL (sym->etype).v_char) - printChar (code->oFile, + printChar (out, SPEC_CVAL (sym->etype).v_char, strlen(SPEC_CVAL (sym->etype).v_char)+1); else - tfprintf(code->oFile, "\t!ds\n", (unsigned int)getSize (sym->type)& 0xffff); + tfprintf(out, "\t!ds\n", (unsigned int)getSize (sym->type)& 0xffff); } } } @@ -761,8 +809,20 @@ void emitMaps () emitRegularMap (xdata, TRUE,TRUE); emitRegularMap (sfr, FALSE,FALSE); emitRegularMap (sfrbit, FALSE,FALSE); + emitRegularMap (home, TRUE,FALSE); emitRegularMap (code, TRUE,FALSE); - emitStaticSeg (statsg); + + emitStaticSeg (statsg, code->oFile); +} + +/*-----------------------------------------------------------------*/ +/* flushStatics - flush all currently defined statics out to file */ +/* and delete. Temporary function */ +/*-----------------------------------------------------------------*/ +void flushStatics(void) +{ + emitStaticSeg(statsg, codeOutFile); + statsg->syms = NULL; } /*-----------------------------------------------------------------*/ @@ -843,7 +903,7 @@ void printPublics (FILE * afile) symbol *sym; fprintf (afile, "%s", iComments2); - fprintf (afile, "; publics variables in this module\n"); + fprintf (afile, "; Public variables in this module\n"); fprintf (afile, "%s", iComments2); for (sym = setFirstItem (publics); sym; @@ -851,6 +911,22 @@ void printPublics (FILE * afile) tfprintf(afile, "\t!global\n", sym->rname); } +/*-----------------------------------------------------------------*/ +/* printExterns - generates .global for externs */ +/*-----------------------------------------------------------------*/ +void printExterns (FILE * afile) +{ + symbol *sym; + + fprintf (afile, "%s", iComments2); + fprintf (afile, "; Externals used\n"); + fprintf (afile, "%s", iComments2); + + for (sym = setFirstItem (externs); sym; + sym = setNextItem (externs)) + tfprintf(afile, "\t!global\n", sym->rname); +} + /*-----------------------------------------------------------------*/ /* emitOverlay - will emit code for the overlay stuff */ /*-----------------------------------------------------------------*/ @@ -879,8 +955,8 @@ static void emitOverlay(FILE *afile) for (sym = setFirstItem(ovrset); sym; sym = setNextItem(ovrset)) { - - /* if extern then do nothing */ + + /* if extern then add it to the publics tabledo nothing */ if (IS_EXTERN (sym->etype)) continue; @@ -956,7 +1032,7 @@ void glue () addSetHead(&tmpfileSet,ovrFile); /* print the global struct definitions */ - if (options.debug) + if (options.debug && !options.nodebug) cdbStructBlock (0,cdbFile); vFile = tempfile(); @@ -1004,7 +1080,9 @@ void glue () /* print the global variables in this module */ printPublics (asmFile); - + if (port->assembler.externGlobal) + printExterns (asmFile); + /* copy the sfr segment */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; special function registers\n"); @@ -1132,7 +1210,14 @@ void glue () tfprintf(asmFile, "\t!area\n", port->mem.post_static_name); fprintf (asmFile,"\tljmp\t__sdcc_program_startup\n"); } - + + fprintf (asmFile, + "%s" + "; Home\n" + "%s", iComments2, iComments2); + tfprintf(asmFile, "\t!areahome\n", HOME_NAME); + copyFile (asmFile, home->oFile); + /* copy over code */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; code\n");