X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic16%2Fmain.c;h=ab2748f087a6ebc0213d42adffd3df642b720924;hb=d45f7da912395d3c092bfbef9f954dd45a1fa90f;hp=67cc81e2cb49d0cd3cd4681273ad16a12314cb81;hpb=b0528af48546cdfe3f2be3c126732eaff8933fe2;p=fw%2Fsdcc diff --git a/src/pic16/main.c b/src/pic16/main.c index 67cc81e2..ab2748f0 100644 --- a/src/pic16/main.c +++ b/src/pic16/main.c @@ -100,41 +100,32 @@ extern void pic16_emitIDRegs(FILE *of); static void _pic16_init (void) { - asm_addTree (&asm_asxxxx_mapping); - pic16_pCodeInitRegisters(); - maxInterrupts = 2; - - /* set pic16 port options to defaults */ - pic16_options.no_banksel = 0; - pic16_options.opt_banksel = 0; - pic16_options.omit_configw = 0; - pic16_options.omit_ivt = 0; - pic16_options.leave_reset = 0; - pic16_options.stack_model = 0; /* 0 for 'small', 1 for 'large' */ - pic16_options.ivt_loc = 0x000000; /* default location of interrupt vectors */ - pic16_options.nodefaultlibs = 0; /* link default libraries */ - pic16_options.dumpcalltree = 0; + asm_addTree (&asm_asxxxx_mapping); + pic16_pCodeInitRegisters(); + maxInterrupts = 2; } static void -_pic16_reset_regparm () +_pic16_reset_regparm (void) { - regParmFlg = 0; + regParmFlg = 0; } static int _pic16_regparm (sym_link * l) { - /* for this processor it is simple - * can pass only the first parameter in a register */ - if(pic16_fstack) { - if(regParmFlg)return 0; - regParmFlg = 1; - return 1; - } else { - regParmFlg++;// = 1; - return 1; - } + /* force all parameters via SEND/RECEIVE */ + if(0 /*pic16_options.ip_stack*/) { + /* for this processor it is simple + * can pass only the first parameter in a register */ + if(regParmFlg)return 0; + regParmFlg++; + return 1; //regParmFlg; + } else { + /* otherwise pass all arguments in registers via SEND/RECEIVE */ + regParmFlg++;// = 1; + return regParmFlg; + } } @@ -165,6 +156,8 @@ _process_pragma(const char *sz) maxRAMaddress = (int)floatFromVal(maxRAMVal); pic16_setMaxRAM(maxRAMaddress); } + + return 0; } /* #pragma stack [stack-position] [stack-len] */ @@ -187,7 +180,10 @@ _process_pragma(const char *sz) if(stackLen < 1) { stackLen = 64; - fprintf(stderr, "%s:%d setting stack to default size 0x%x\n", __FILE__, __LINE__, stackLen); + fprintf(stderr, "%s:%d: warning: setting stack to default size %d (0x%04x)\n", + filename, lineno-1, stackLen, stackLen); + +// fprintf(stderr, "%s:%d setting stack to default size %d\n", __FILE__, __LINE__, stackLen); } // fprintf(stderr, "Initializing stack pointer at 0x%x len 0x%x\n", stackPos, stackLen); @@ -219,13 +215,20 @@ _process_pragma(const char *sz) value *addr; absS = Safe_calloc(1, sizeof(absSym)); - absS->name = Safe_strdup( symname ); + sprintf(absS->name, "_%s", symname); + addr = constVal( location ); absS->address = (unsigned int)floatFromVal( addr ); + if((absS->address % 2) != 0) { + absS->address--; + fprintf(stderr, "%s:%d: warning: code memory locations should be word aligned, will locate to 0x%06x instead\n", + filename, lineno-1, absS->address); + } + addSet(&absSymSet, absS); - fprintf(stderr, "%s:%d symbol %s will be placed in location 0x%06x in code memory\n", - __FILE__, __LINE__, symname, absS->address); +// fprintf(stderr, "%s:%d symbol %s will be placed in location 0x%06x in code memory\n", +// __FILE__, __LINE__, symname, absS->address); return 0; } @@ -234,12 +237,12 @@ _process_pragma(const char *sz) if(startsWith(ptr, "udata")) { char *sectname = strtok((char *)NULL, WHITE); char *symname = strtok((char *)NULL, WHITE); + symbol *nsym; sectSym *ssym; sectName *snam; int found=0; while(symname) { - ssym = Safe_calloc(1, sizeof(sectSyms)); ssym->name = Safe_calloc(1, strlen(symname)+2); sprintf(ssym->name, "_%s", symname); @@ -247,6 +250,10 @@ _process_pragma(const char *sz) addSet(§Syms, ssym); + nsym = newSymbol(symname, 0); + strcpy(nsym->rname, ssym->name); + checkAddSym(&publics, nsym); + found = 0; for(snam=setFirstItem(sectNames);snam;snam=setNextItem(sectNames)) { if(!strcmp(sectname, snam->name)){ found=1; break; } @@ -287,6 +294,7 @@ _process_pragma(const char *sz) #define MPLAB_COMPAT "--mplab-comp" #define NL_OPT "--nl=" +#define USE_CRT "--use-crt=" char *alt_asm=NULL; char *alt_link=NULL; @@ -324,6 +332,8 @@ OPTION pic16_optionsTable[]= { { 0, MPLAB_COMPAT, &pic16_mplab_comp, "enable compatibility mode for MPLAB utilities (MPASM/MPLINK)"}, { 0, "--fstack", &pic16_fstack, "enable stack optimizations"}, { 0, NL_OPT, NULL, "new line, \"lf\" or \"crlf\""}, + { 0, USE_CRT, NULL, "use run-time initialization module"}, + { 0, "--no-crt", &pic16_options.no_crt, "do not link any default run-time initialization module"}, { 0, NULL, NULL, NULL} }; @@ -400,41 +410,59 @@ _pic16_parseOptions (int *pargc, char **argv, int *i) } return TRUE; } + + if(ISOPT(USE_CRT)) { + pic16_options.no_crt = 0; + pic16_options.crt_name = Safe_strdup( getStringArg(USE_CRT, argv, i, *pargc) ); + + return TRUE; + } return FALSE; } +extern set *userIncDirsSet; + static void _pic16_initPaths(void) { char pic16incDir[512]; char pic16libDir[512]; - set *pic16incDirsSet; - set *pic16libDirsSet; + set *pic16incDirsSet=NULL; + set *pic16libDirsSet=NULL; char devlib[512]; - setMainValue("mcu", pic16->name[2] ); - addSet(&preArgvSet, Safe_strdup("-D{mcu}")); + setMainValue("mcu", pic16->name[2] ); + addSet(&preArgvSet, Safe_strdup("-D{mcu}")); - sprintf(pic16incDir, "%s%cpic16", INCLUDE_DIR_SUFFIX, DIR_SEPARATOR_CHAR); - sprintf(pic16libDir, "%s%cpic16", LIB_DIR_SUFFIX, DIR_SEPARATOR_CHAR); + sprintf(pic16incDir, "%s%cpic16", INCLUDE_DIR_SUFFIX, DIR_SEPARATOR_CHAR); + sprintf(pic16libDir, "%s%cpic16", LIB_DIR_SUFFIX, DIR_SEPARATOR_CHAR); - if(!options.nostdinc) { - /* setup pic16 include directory */ - pic16incDirsSet = appendStrSet(dataDirsSet, NULL, pic16incDir); - mergeSets(&includeDirsSet, pic16incDirsSet); - } - - if(!options.nostdlib) { - /* setup pic16 library directory */ - pic16libDirsSet = appendStrSet(dataDirsSet, NULL, pic16libDir); - mergeSets(&libDirsSet, pic16libDirsSet); - } - - if(!pic16_options.nodefaultlibs) { - /* now add the library for the device */ - sprintf(devlib, "%s.lib", pic16->name[2]); - addSet(&libFilesSet, Safe_strdup(devlib)); - } + + if(!options.nostdinc) { + /* setup pic16 include directory */ + pic16incDirsSet = appendStrSet(dataDirsSet, NULL, pic16incDir); + includeDirsSet = pic16incDirsSet; +// mergeSets(&includeDirsSet, pic16incDirsSet); + } + /* pic16 port should not search to the SDCC standard include directories, + * so add here the deleted include dirs that user has issued in command line */ + mergeSets(&pic16incDirsSet, userIncDirsSet); + + if(!options.nostdlib) { + /* setup pic16 library directory */ + pic16libDirsSet = appendStrSet(dataDirsSet, NULL, pic16libDir); + libDirsSet = pic16libDirsSet; +// mergeSets(&libDirsSet, pic16libDirsSet); + } + + if(!pic16_options.nodefaultlibs) { + /* now add the library for the device */ + sprintf(devlib, "%s.lib", pic16->name[2]); + addSet(&libFilesSet, Safe_strdup(devlib)); + + /* add the internal SDCC library */ + addSet(&libFilesSet, Safe_strdup( "libsdcc.lib" )); + } } extern set *linkOptionsSet; @@ -457,7 +485,7 @@ static void _pic16_linkEdit(void) * */ - sprintf(lfrm, "{linker} {incdirs} {lflags} -o {outfile} {spec_ofiles} {ofiles} {libs}"); + sprintf(lfrm, "{linker} {incdirs} {lflags} -o {outfile} {user_ofile} {spec_ofiles} {ofiles} {libs}"); shash_add(&linkValues, "linker", "gplink"); @@ -471,11 +499,13 @@ static void _pic16_linkEdit(void) if(fullSrcFileName) { sprintf(temp, "%s.o", dstFileName); -// shash_add(&linkValues, "srcofile", temp); - addSetHead(&relFilesSet, temp); +// addSetHead(&relFilesSet, Safe_strdup(temp)); + shash_add(&linkValues, "user_ofile", temp); } -// shash_add(&linkValues, "spec_ofiles", "crt0i.o"); + if(!pic16_options.no_crt) + shash_add(&linkValues, "spec_ofiles", pic16_options.crt_name); + shash_add(&linkValues, "ofiles", joinStrSet(relFilesSet)); shash_add(&linkValues, "libs", joinStrSet(libFilesSet)); @@ -497,55 +527,38 @@ extern const char *pic16_asmCmd[]; static void _pic16_finaliseOptions (void) { - port->mem.default_local_map = data; - port->mem.default_globl_map = data; + port->mem.default_local_map = data; + port->mem.default_globl_map = data; + + /* peepholes are disabled for the time being */ + options.nopeep = 1; - /* peepholes are disabled for the time being */ - options.nopeep = 1; + /* explicit enable peepholes for testing */ + if(pic16_enable_peeps) + options.nopeep = 0; - /* explicit enable peepholes for testing */ - if(pic16_enable_peeps) - options.nopeep = 0; + options.all_callee_saves = 1; // always callee saves - options.all_callee_saves = 1; // always callee saves -// options.float_rent = 1; -// options.intlong_rent = 1; +#if 0 + options.float_rent = 1; + options.intlong_rent = 1; +#endif - if(alt_asm && strlen(alt_asm)) - pic16_asmCmd[0] = alt_asm; + if(alt_asm && strlen(alt_asm)) + pic16_asmCmd[0] = alt_asm; - if(alt_link && strlen(alt_link)) - pic16_linkCmd[0] = alt_link; + if(alt_link && strlen(alt_link)) + pic16_linkCmd[0] = alt_link; + + if(!pic16_options.no_crt) { + pic16_options.omit_ivt = 1; + pic16_options.leave_reset = 0; + } } -/* all the rest is commented ifdef'd out */ #if 0 - /* Hack-o-matic: if we are using the flat24 model, - * adjust pointer sizes. - */ - if (options.model == MODEL_FLAT24) - { - - fprintf (stderr, "*** WARNING: you should use the '-mds390' option " - "for DS80C390 support. This code generator is " - "badly out of date and probably broken.\n"); - - port->s.fptr_size = 3; - port->s.gptr_size = 4; - port->stack.isr_overhead++; /* Will save dpx on ISR entry. */ -#if 1 - port->stack.call_overhead++; /* This acounts for the extra byte - * of return addres on the stack. - * but is ugly. There must be a - * better way. - */ -#endif - fReturn = fReturn390; - fReturnSize = 5; - } - if (options.model == MODEL_LARGE) { port->mem.default_local_map = xdata; @@ -581,19 +594,26 @@ _pic16_finaliseOptions (void) static void _pic16_setDefaultOptions (void) { - /* initialize to defaults section locations, names and addresses */ - pic16_sectioninfo.at_udata = "udata"; - - /* set pic16 port options to defaults */ - pic16_options.no_banksel = 0; - pic16_options.opt_banksel = 0; - pic16_options.omit_configw = 0; - pic16_options.omit_ivt = 0; - pic16_options.leave_reset = 0; - pic16_options.stack_model = 0; /* 0 for 'small', 1 for 'large' */ - pic16_options.ivt_loc = 0x000000; - pic16_options.nodefaultlibs = 0; - pic16_options.dumpcalltree = 0; + options.stackAuto = 0; /* implicit declaration */ + /* port is not capable yet to allocate separate registers + * dedicated for passing certain parameters */ + + /* initialize to defaults section locations, names and addresses */ + pic16_sectioninfo.at_udata = "udata"; + + /* set pic16 port options to defaults */ + pic16_options.no_banksel = 0; + pic16_options.opt_banksel = 0; + pic16_options.omit_configw = 0; + pic16_options.omit_ivt = 0; + pic16_options.leave_reset = 0; + pic16_options.stack_model = 0; /* 0 for 'small', 1 for 'large' */ + pic16_options.ivt_loc = 0x000000; + pic16_options.nodefaultlibs = 0; + pic16_options.dumpcalltree = 0; + pic16_options.crt_name = "crt0i.o"; /* the default crt to link */ + pic16_options.no_crt = 0; /* use crt by default */ + pic16_options.ip_stack = 1; /* set to 1 to enable ipop/ipush for stack */ } static const char * @@ -682,13 +702,13 @@ static bool _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right) #if 1 /* multiplication is fixed */ /* support mul for char/int/long */ - if((getSize(OP_SYMBOL(IC_LEFT(ic))->type ) <= 4) - && (ic->op == '*'))return TRUE; + if((ic->op == '*') + && (getSize(OP_SYMBOL(IC_LEFT(ic))->type ) < 2))return TRUE; #endif #if 0 /* support div for char/int/long */ - if((getSize(OP_SYMBOL(IC_LEFT(ic))->type ) <= 0) + if((getSize(OP_SYMBOL(IC_LEFT(ic))->type ) < 0) && (ic->op == '/'))return TRUE; #endif @@ -826,7 +846,7 @@ PORT pic16_port = 4, /* long */ 2, /* ptr */ 3, /* fptr, far pointers (see Microchip) */ - 2, /* gptr */ + 3, /* gptr */ 1, /* bit */ 4, /* float */ 4 /* max */