X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpic%2Fglue.c;h=d1f271717f98e2d94880c1402f19de6fbb689ba0;hb=238e1b53dc1ac88bd559c93bd7f355d0887d39e1;hp=e0f73fb7c1b42c958143df29235f2be4b69b1c93;hpb=f9a4a145345d4455c6431a79e3ce9a1029eb3dcb;p=fw%2Fsdcc diff --git a/src/pic/glue.c b/src/pic/glue.c index e0f73fb7..d1f27171 100644 --- a/src/pic/glue.c +++ b/src/pic/glue.c @@ -29,7 +29,7 @@ #include "newalloc.h" -#ifdef _BIG_ENDIAN +#ifdef WORDS_BIGENDIAN #define _ENDIAN(x) (3-x) #else #define _ENDIAN(x) (x) @@ -41,6 +41,7 @@ extern symbol *interrupts[256]; static void printIval (symbol * sym, sym_link * type, initList * ilist, pBlock *pb); extern int noAlloc; extern set *publics; +extern set *externs; extern unsigned maxInterrupts; extern int maxRegBank; extern symbol *mainf; @@ -57,6 +58,7 @@ extern DEFSETFUNC (rmTmpFiles); extern void AnalyzeBanking (void); extern void copyFile (FILE * dest, FILE * src); +extern void ReuseReg(void); extern void InlinepCode(void); extern void writeUsedRegs(FILE *); @@ -65,6 +67,9 @@ extern void printPublics (FILE * afile); extern void printChar (FILE * ofile, char *s, int plen); void pCodeInitRegisters(void); +int getConfigWord(int address); + +char *udata_section_name=0; // FIXME Temporary fix to change udata section name -- VR /*-----------------------------------------------------------------*/ /* aopLiteral - string from a literal value */ @@ -86,7 +91,7 @@ int pic14aopLiteral (value *val, int offset) /* it is type float */ fl.f = (float) floatFromVal(val); -#ifdef _BIG_ENDIAN +#ifdef WORDS_BIGENDIAN return fl.c[3-offset]; #else return fl.c[offset]; @@ -102,109 +107,118 @@ static void pic14emitRegularMap (memmap * map, bool addPublics, bool arFlag) { symbol *sym; - int i, size, bitvars = 0;; + int bitvars = 0;; + /* print the area name */ if (addPublics) fprintf (map->oFile, ";\t.area\t%s\n", map->sname); - /* print the area name */ for (sym = setFirstItem (map->syms); sym; - sym = setNextItem (map->syms)) - { - - /* if extern then do nothing */ - if (IS_EXTERN (sym->etype)) - continue; - - /* 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; - - /* 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)) - addSetHead (&publics, sym); + sym = setNextItem (map->syms)) { - /* if extern then do nothing or is a function - then do nothing */ - if (IS_FUNC (sym->type)) - continue; -#if 0 - /* print extra debug info if required */ - if (options.debug || sym->level == 0) - { + //printf("%s\n",sym->name); - cdbSymbol (sym, cdbFile, FALSE, FALSE); + /* if extern then add it into the extern list */ + if (IS_EXTERN (sym->etype)) { + addSetHead (&externs, sym); + continue; + } - if (!sym->level) /* global */ - if (IS_STATIC (sym->etype)) - fprintf (map->oFile, "F%s_", moduleName); /* scope is file */ - else - fprintf (map->oFile, "G_"); /* scope is global */ + /* 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; + + /* 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)) + addSetHead (&publics, sym); + + // PIC code allocates its own registers - so ignore parameter variable generated by processFuncArgs() + if (sym->_isparm) + continue; + /* if extern then do nothing or is a function + then do nothing */ + if (IS_FUNC (sym->type)) + continue; +#if 0 + /* print extra debug info if required */ + if (options.debug || sym->level == 0) + { + if (!sym->level) /* global */ + if (IS_STATIC (sym->etype)) + fprintf (map->oFile, "F%s_", moduleName); /* scope is file */ else - /* symbol is local */ - fprintf (map->oFile, "L%s_", (sym->localof ? sym->localof->name : "-null-")); - fprintf (map->oFile, "%s_%d_%d", sym->name, sym->level, sym->block); - } + fprintf (map->oFile, "G_"); /* scope is global */ + else + /* symbol is local */ + fprintf (map->oFile, "L%s_", (sym->localof ? sym->localof->name : "-null-")); + fprintf (map->oFile, "%s_%d_%d", sym->name, sym->level, sym->block); + } #endif - /* if is has an absolute address then generate - an equate for this no need to allocate space */ - if (SPEC_ABSA (sym->etype)) - { - //if (options.debug || sym->level == 0) - //fprintf (map->oFile,"; == 0x%04x\n",SPEC_ADDR (sym->etype)); - - fprintf (map->oFile, "%s\tEQU\t0x%04x\n", - sym->rname, - SPEC_ADDR (sym->etype)); - } - else - { - /* allocate space */ + /* if it has an absolute address then generate + an equate for this no need to allocate space */ + if (SPEC_ABSA (sym->etype)) + { + //if (options.debug || sym->level == 0) + //fprintf (map->oFile,"; == 0x%04x\n",SPEC_ADDR (sym->etype)); - /* If this is a bit variable, then allocate storage after 8 bits have been declared */ - /* unlike the 8051, the pic does not have a separate bit area. So we emulate bit ram */ - /* by grouping the bits together into groups of 8 and storing them in the normal ram. */ - if (IS_BITVAR (sym->etype)) - { - bitvars++; - } - else - { - fprintf (map->oFile, "\t%s\n", sym->rname); - if ((size = (unsigned int) getSize (sym->type) & 0xffff) > 1) - { - for (i = 1; i < size; i++) - fprintf (map->oFile, "\t%s_%d\n", sym->rname, i); - } - } - //fprintf (map->oFile, "\t.ds\t0x%04x\n", (unsigned int)getSize (sym->type) & 0xffff); - } - - /* if it has a initial value then do it only if - it is a global variable */ - if (sym->ival && sym->level == 0) { - ast *ival = NULL; + fprintf (map->oFile, "%s\tEQU\t0x%04x\n", + sym->rname, + SPEC_ADDR (sym->etype)); + } + else + { + /* allocate space */ + + /* If this is a bit variable, then allocate storage after 8 bits have been declared */ + /* unlike the 8051, the pic does not have a separate bit area. So we emulate bit ram */ + /* by grouping the bits together into groups of 8 and storing them in the normal ram. */ + if (IS_BITVAR (sym->etype)) + { + bitvars++; + } + else + { + fprintf (map->oFile, "%s\tres\t%d\n", sym->rname,getSize (sym->type) & 0xffff); + /* + { + int i, size; + + if ((size = (unsigned int) getSize (sym->type) & 0xffff) > 1) + { + for (i = 1; i < size; i++) + fprintf (map->oFile, "\t%s_%d\n", sym->rname, i); + } + } + */ + } + //fprintf (map->oFile, "\t.ds\t0x%04x\n", (unsigned int)getSize (sym->type) & 0xffff); + } + + /* if it has a initial value then do it only if + it is a global variable */ + if (sym->ival && sym->level == 0) { + ast *ival = NULL; - if (IS_AGGREGATE (sym->type)) - ival = initAggregates (sym, sym->ival, NULL); - else - ival = newNode ('=', newAst_VALUE(symbolVal (sym)), - decorateType (resolveSymbols (list2expr (sym->ival)))); - codeOutFile = statsg->oFile; - GcurMemmap = statsg; - eBBlockFromiCode (iCodeFromAst (ival)); - sym->ival = NULL; - } + if (IS_AGGREGATE (sym->type)) + ival = initAggregates (sym, sym->ival, NULL); + else + ival = newNode ('=', newAst_VALUE(symbolVal (sym)), + decorateType (resolveSymbols (list2expr (sym->ival)), RESULT_CHECK)); + codeOutFile = statsg->oFile; + GcurMemmap = statsg; + eBBlockFromiCode (iCodeFromAst (ival)); + sym->ival = NULL; } + } } @@ -272,7 +286,7 @@ printIvalChar (sym_link * type, initList * ilist, pBlock *pb, char *s) if(!pb) return 0; - fprintf(stderr, "%s\n",__FUNCTION__); + //fprintf(stderr, "%s\n",__FUNCTION__); if (!s) { @@ -299,7 +313,7 @@ printIvalChar (sym_link * type, initList * ilist, pBlock *pb, char *s) else { //printChar (oFile, s, strlen (s) + 1); - for(remain=0; remainsyms); sym; sym = setNextItem (map->syms)) { - /* if it is "extern" then do nothing */ - if (IS_EXTERN (sym->etype)) - continue; + /* if extern then add it into the extern list */ + if (IS_EXTERN (sym->etype)) { + addSetHead (&externs, sym); + continue; + } /* if it is not static add it to the public table */ @@ -447,11 +463,6 @@ pic14emitStaticSeg (memmap * map) /* print extra debug info if required */ if (options.debug || sym->level == 0) { - /* NOTE to me - cdbFile may be null in which case, - * the sym name will be printed to stdout. oh well */ - if(cdbFile) - cdbSymbol (sym, cdbFile, FALSE, FALSE); - if (!sym->level) { /* global */ if (IS_STATIC (sym->etype)) @@ -489,7 +500,7 @@ pic14emitStaticSeg (memmap * map) fprintf (code->oFile, "%s:\n", sym->rname); noAlloc++; - resolveIvalSym (sym->ival); + resolveIvalSym (sym->ival, sym->type); //printIval (sym, sym->type, sym->ival, code->oFile); pb = newpCodeChain(NULL, 'P',newpCodeCharP("; Starting pCode block for Ival")); addpBlock(pb); @@ -543,7 +554,6 @@ pic14emitMaps () static void pic14createInterruptVect (FILE * vFile) { - unsigned i = 0; mainf = newSymbol ("main", 0); mainf->block = 0; @@ -551,7 +561,8 @@ pic14createInterruptVect (FILE * vFile) if (!(mainf = findSymWithLevel (SymbolTab, mainf))) { if (!options.cc_only) - werror (E_NO_MAIN); +// werror (E_NO_MAIN); + fprintf(stderr,"WARNING: function 'main' undefined\n"); return; } @@ -560,33 +571,22 @@ pic14createInterruptVect (FILE * vFile) { /* if ! compile only then main function should be present */ if (!options.cc_only) - werror (E_NO_MAIN); +// werror (E_NO_MAIN); + fprintf(stderr,"WARNING: function 'main' undefined\n"); return; } - fprintf (vFile, ";\t.area\t%s\n", CODE_NAME); - fprintf (vFile, ";__interrupt_vect:\n"); - - - if (!port->genIVT || !(port->genIVT (vFile, interrupts, maxInterrupts))) - { - /* "generic" interrupt table header (if port doesn't specify one). - - * Look suspiciously like 8051 code to me... - */ - - fprintf (vFile, ";\tljmp\t__sdcc_gsinit_startup\n"); - - - /* now for the other interrupts */ - for (; i < maxInterrupts; i++) - { - if (interrupts[i]) - fprintf (vFile, ";\tljmp\t%s\n;\t.ds\t5\n", interrupts[i]->rname); - else - fprintf (vFile, ";\treti\n;\t.ds\t7\n"); - } - } + fprintf (vFile, "%s", iComments2); + fprintf (vFile, "; config word \n"); + fprintf (vFile, "%s", iComments2); + fprintf (vFile, "\t__config 0x%x\n", getConfigWord(0x2007)); + + fprintf (vFile, "%s", iComments2); + fprintf (vFile, "; reset vector \n"); + fprintf (vFile, "%s", iComments2); + fprintf (vFile, "STARTUP\t%s\n", CODE_NAME); // Lkr file should place section STARTUP at address 0x0 + fprintf (vFile, "\tnop\n"); /* first location for used by incircuit debugger */ + fprintf (vFile, "\tgoto\t__sdcc_gsinit_startup\n"); } @@ -602,6 +602,23 @@ pic14initialComments (FILE * afile) } +/*-----------------------------------------------------------------*/ +/* printExterns - generates extern for external variables */ +/*-----------------------------------------------------------------*/ +static void +pic14printExterns (FILE * afile) +{ + symbol *sym; + + fprintf (afile, "%s", iComments2); + fprintf (afile, "; extern variables in this module\n"); + fprintf (afile, "%s", iComments2); + + for (sym = setFirstItem (externs); sym; + sym = setNextItem (externs)) + fprintf (afile, "\textern %s\n", sym->rname); +} + /*-----------------------------------------------------------------*/ /* printPublics - generates .global for publics */ /*-----------------------------------------------------------------*/ @@ -615,11 +632,18 @@ pic14printPublics (FILE * afile) fprintf (afile, "%s", iComments2); for (sym = setFirstItem (publics); sym; - sym = setNextItem (publics)) - fprintf (afile, ";\t.globl %s\n", sym->rname); -} - + sym = setNextItem (publics)) { + if(!IS_BITFIELD(sym->type) && ((IS_FUNC(sym->type) || sym->allocreq))) { + if (!IS_BITVAR(sym->type)) + fprintf (afile, "\tglobal %s\n", sym->rname); + } else { + /* Absolute variables are defines in the asm file as equates and thus can not be made global. */ + if (!SPEC_ABSA (sym->etype)) + fprintf (afile, "\tglobal %s\n", sym->rname); + } + } +} /*-----------------------------------------------------------------*/ /* emitOverlay - will emit code for the overlay stuff */ @@ -629,8 +653,13 @@ pic14emitOverlay (FILE * afile) { set *ovrset; - if (!elementsInSet (ovrSetSets)) - fprintf (afile, ";\t.area\t%s\n", port->mem.overlay_name); +/* if (!elementsInSet (ovrSetSets))*/ + + /* the hack below, fixes translates for devices which + * only have udata_shr memory */ + fprintf (afile, "%s\t%s\n", + (elementsInSet(ovrSetSets)?"":";"), + port->mem.overlay_name); /* for each of the sets in the overlay segment do */ for (ovrset = setFirstItem (ovrSetSets); ovrset; @@ -645,6 +674,9 @@ pic14emitOverlay (FILE * afile) otherwise the assembler will append each of these declarations into one chunk and will not overlay sad but true */ + + /* I don't think this applies to us. We are using gpasm. CRF */ + fprintf (afile, ";\t.area _DUMMY\n"); /* output the area informtion */ fprintf (afile, ";\t.area\t%s\n", port->mem.overlay_name); /* MOF */ @@ -680,9 +712,6 @@ pic14emitOverlay (FILE * afile) /* print extra debug info if required */ if (options.debug || sym->level == 0) { - - cdbSymbol (sym, cdbFile, FALSE, FALSE); - if (!sym->level) { /* global */ if (IS_STATIC (sym->etype)) @@ -730,7 +759,7 @@ pic14emitOverlay (FILE * afile) void picglue () { - + char udata_name[80]; FILE *vFile; FILE *asmFile; FILE *ovrFile = tempfile(); @@ -774,14 +803,9 @@ picglue () /* print the global struct definitions */ if (options.debug) - cdbStructBlock (0,cdbFile); + cdbStructBlock (0); vFile = tempfile(); - /* PENDING: this isnt the best place but it will do */ - if (port->general.glue_up_main) { - /* create the interrupt vector table */ - pic14createInterruptVect (vFile); - } addSetHead(&tmpfileSet,vFile); @@ -790,12 +814,15 @@ picglue () /* do the overlay segments */ pic14emitOverlay(ovrFile); + /* PENDING: this isnt the best place but it will do */ + if (port->general.glue_up_main) { + /* create the interrupt vector table */ + pic14createInterruptVect (vFile); + } AnalyzepCode('*'); - //#ifdef PCODE_DEBUG - //printCallTree(stderr); - //#endif + ReuseReg(); // ReuseReg where call tree permits InlinepCode(); @@ -807,13 +834,15 @@ picglue () /* now put it all together into the assembler file */ /* create the assembler file name */ - if (!options.c1mode) { - sprintf (buffer, srcFileName); - strcat (buffer, ".asm"); - } - else { - strcpy(buffer, options.out_name); - } + if ((noAssemble || options.c1mode) && fullDstFileName) + { + sprintf (buffer, fullDstFileName); + } + else + { + sprintf (buffer, dstFileName); + strcat (buffer, ".asm"); + } if (!(asmFile = fopen (buffer, "w"))) { werror (E_FILE_OPEN_ERR, buffer); @@ -832,16 +861,29 @@ picglue () port->genAssemblerPreamble(asmFile); } + /* print the extern variables in this module */ + pic14printExterns (asmFile); + /* print the global variables in this module */ pic14printPublics (asmFile); - /* copy the sfr segment */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; special function registers\n"); fprintf (asmFile, "%s", iComments2); copyFile (asmFile, sfr->oFile); - + + + if (udata_section_name) { + sprintf(udata_name,"%s",udata_section_name); + } else { + sprintf(udata_name,"data_%s",moduleName); + } + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; udata\n"); + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "%s\tudata\n", udata_name); + copyFile (asmFile, data->oFile); /* Put all variables into a cblock */ AnalyzeBanking(); @@ -853,6 +895,8 @@ picglue () fprintf (asmFile, "%s", iComments2); copyFile (asmFile, ovrFile); +#if 0 + /* create the stack segment MOF */ if (mainf && IFFUNC_HASBODY(mainf->type)) { fprintf (asmFile, "%s", iComments2); @@ -876,14 +920,14 @@ picglue () fprintf (asmFile,";\t.area XSEG (XDATA)\n"); /* MOF */ fprintf (asmFile,";\t.ds 256\n"); } - - + /* copy xtern ram data */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; external ram data\n"); fprintf (asmFile, "%s", iComments2); copyFile (asmFile, xdata->oFile); - + +#endif /* copy the bit segment */ fprintf (asmFile, "%s", iComments2); @@ -891,72 +935,56 @@ picglue () fprintf (asmFile, "%s", iComments2); copyFile (asmFile, bit->oFile); - - fprintf (asmFile, "\tORG 0\n"); - /* copy the interrupt vector table */ if (mainf && IFFUNC_HASBODY(mainf->type)) { + copyFile (asmFile, vFile); + fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; interrupt vector \n"); + fprintf (asmFile, "; interrupt and initialization code\n"); fprintf (asmFile, "%s", iComments2); - copyFile (asmFile, vFile); + fprintf (asmFile, "code_init\t%s\t0x4\n", CODE_NAME); // Note - for mplink may have to enlarge section vectors in .lnk file + + /* interrupt service routine */ + fprintf (asmFile, "__sdcc_interrupt:\n"); + copypCode(asmFile, 'I'); + + /* initialize data memory */ + fprintf (asmFile,"__sdcc_gsinit_startup:\n"); + /* FIXME: This is temporary. The idata section should be used. If + not, we could add a special feature to the linker. This will + work in the mean time. Put all initalized data in main.c */ + copypCode(asmFile, statsg->dbName); + fprintf (asmFile,"\tpagesel _main\n"); + fprintf (asmFile,"\tgoto _main\n"); } - + +#if 0 + /* copy global & static initialisations */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; global & static initialisations\n"); fprintf (asmFile, "%s", iComments2); - - /* Everywhere we generate a reference to the static_name area, - * (which is currently only here), we immediately follow it with a - * definition of the post_static_name area. This guarantees that - * the post_static_name area will immediately follow the static_name - * area. - */ - fprintf (asmFile, ";\t.area %s\n", port->mem.static_name); /* MOF */ - fprintf (asmFile, ";\t.area %s\n", port->mem.post_static_name); - fprintf (asmFile, ";\t.area %s\n", port->mem.static_name); - - if (mainf && IFFUNC_HASBODY(mainf->type)) { - fprintf (asmFile,"__sdcc_gsinit_startup:\n"); - /* if external stack is specified then the - higher order byte of the xdatalocation is - going into P2 and the lower order going into - spx */ - if (options.useXstack) { - fprintf(asmFile,";\tmov\tP2,#0x%02x\n", - (((unsigned int)options.xdata_loc) >> 8) & 0xff); - fprintf(asmFile,";\tmov\t_spx,#0x%02x\n", - (unsigned int)options.xdata_loc & 0xff); - } + copypCode(asmFile, statsg->dbName); - } +#endif - 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 - * by the ugly shucking and jiving about 20 lines ago. - */ - fprintf(asmFile, ";\t.area %s\n", port->mem.post_static_name); - fprintf (asmFile,";\tljmp\t__sdcc_program_startup\n"); - } - /* copy over code */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; code\n"); fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, ";\t.area %s\n", port->mem.code_name); + fprintf (asmFile, "code_%s\t%s\n", moduleName, port->mem.code_name); - //copyFile (stderr, code->oFile); - - copypCode(asmFile, 'I'); - copypCode(asmFile, statsg->dbName); + /* unknown */ copypCode(asmFile, 'X'); + + /* _main function */ copypCode(asmFile, 'M'); + + /* other functions */ copypCode(asmFile, code->dbName); - copypCode(asmFile, 'P'); + /* unknown */ + copypCode(asmFile, 'P'); fprintf (asmFile,"\tend\n");