X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic16%2Fglue.c;h=53c630499ca451271e97586158443cc1d4df88e2;hb=393452609b32a44881a3e964423d41c810e09001;hp=3d26af46c6e28576791007bd68ef56b87ea15c0b;hpb=2fd915c3bc6488cd960572406ba8580a90b28b78;p=fw%2Fsdcc diff --git a/src/pic16/glue.c b/src/pic16/glue.c index 3d26af46..53c63049 100644 --- a/src/pic16/glue.c +++ b/src/pic16/glue.c @@ -55,6 +55,7 @@ extern int initsfpnt; extern unsigned long pFile_isize; extern unsigned long pic16_countInstructions(); +set *pic16_localFunctions = NULL; set *rel_idataSymSet=NULL; set *fix_idataSymSet=NULL; @@ -79,7 +80,7 @@ extern void pic16_pCodeConstString(char *name, char *value); /*-----------------------------------------------------------------*/ /* aopLiteral - string from a literal value */ /*-----------------------------------------------------------------*/ -int pic16aopLiteral (value *val, int offset) +unsigned int pic16aopLiteral (value *val, int offset) { union { float f; @@ -427,7 +428,7 @@ value *pic16_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; @@ -859,7 +860,7 @@ void pic16_printIvalStruct (symbol * sym, sym_link * type, iloop = ilist->init.deep; } - for (; sflds; sflds = sflds->next, iloop = (iloop ? iloop->next : NULL)) { + for (; (sflds && iloop); sflds = sflds->next, iloop = (iloop ? iloop->next : NULL)) { // fprintf(stderr, "%s:%d sflds: %p\tiloop = %p\n", __FILE__, __LINE__, sflds, iloop); if (IS_BITFIELD(sflds->type)) { pic16_printIvalBitFields(&sflds, &iloop, ptype, p); @@ -1436,7 +1437,7 @@ void pic16_emitConfigRegs(FILE *of) { int i; - for(i=0;icwInfo.confAddrEnd-pic16->cwInfo.confAddrStart;i++) + for(i=0;i<=(pic16->cwInfo.confAddrEnd-pic16->cwInfo.confAddrStart);i++) if(pic16->cwInfo.crInfo[i].emit) //mask != -1) fprintf (of, "\t__config 0x%x, 0x%hhx\n", pic16->cwInfo.confAddrStart+i, @@ -1447,7 +1448,7 @@ void pic16_emitIDRegs(FILE *of) { int i; - for(i=0;iidInfo.idAddrEnd-pic16->idInfo.idAddrStart;i++) + for(i=0;i<=(pic16->idInfo.idAddrEnd-pic16->idInfo.idAddrStart);i++) if(pic16->idInfo.irInfo[i].emit) fprintf (of, "\t__idlocs 0x%06x, 0x%hhx\n", pic16->idInfo.idAddrStart+i, @@ -1522,6 +1523,41 @@ pic16initialComments (FILE * afile) } } +int +pic16_stringInSet(const char *str, set **world, int autoAdd) +{ + char *s; + + if (!str) return 1; + assert(world); + + for (s = setFirstItem(*world); s; s = setNextItem(*world)) + { + /* found in set */ + if (0 == strcmp(s, str)) return 1; + } + + /* not found */ + if (autoAdd) addSet(world, Safe_strdup(str)); + return 0; +} + +static int +pic16_emitSymbolIfNew(FILE *file, const char *fmt, const char *sym, int checkLocals) +{ + static set *emitted = NULL; + + if (!pic16_stringInSet(sym, &emitted, 1)) { + /* sym was not in emittedSymbols */ + if (!checkLocals || !pic16_stringInSet(sym, &pic16_localFunctions, 0)) { + /* sym is not a locally defined function---avoid bug #1443651 */ + fprintf( file, fmt, sym ); + return 0; + } + } + return 1; +} + /*-----------------------------------------------------------------*/ /* printPublics - generates global declarations for publics */ /*-----------------------------------------------------------------*/ @@ -1537,7 +1573,7 @@ pic16printPublics (FILE *afile) for(sym = setFirstItem (publics); sym; sym = setNextItem (publics)) /* sanity check */ if(!IS_STATIC(sym->etype)) - fprintf(afile, "\tglobal %s\n", sym->rname); + pic16_emitSymbolIfNew(afile, "\tglobal %s\n", sym->rname, 0); } /*-----------------------------------------------------------------*/ @@ -1557,10 +1593,10 @@ pic16_printExterns(FILE *afile) fprintf(afile, "%s", iComments2); for(sym = setFirstItem(externs); sym; sym = setNextItem(externs)) - fprintf(afile, "\textern %s\n", sym->rname); + pic16_emitSymbolIfNew(afile, "\textern %s\n", sym->rname, 1); for(sym = setFirstItem(pic16_builtin_functions); sym; sym = setNextItem(pic16_builtin_functions)) - fprintf(afile, "\textern _%s\n", sym->name); + pic16_emitSymbolIfNew(afile, "\textern _%s\n", sym->name, 1); } /*-----------------------------------------------------------------*/ @@ -1809,12 +1845,12 @@ pic16glue () pic16_OptimizeJumps(); } - /* print the extern variables to this module */ - pic16_printExterns(asmFile); - /* print the global variables in this module */ pic16printPublics (asmFile); + /* print the extern variables to this module */ + pic16_printExterns(asmFile); + pic16_writeUsedRegs(asmFile); #if 0