X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic%2Fmain.c;h=7e87781be36730c5a78ca0f853c860c5530c0b98;hb=b17bba4e10285e6cf6b34dfd5677710b2ba70822;hp=760ad9a0e6ec1670b1017da93098b619ad00e377;hpb=d0b75a25e014ff9924b4961e7927de9f591f5d0d;p=fw%2Fsdcc diff --git a/src/pic/main.c b/src/pic/main.c index 760ad9a0..7e87781b 100644 --- a/src/pic/main.c +++ b/src/pic/main.c @@ -12,50 +12,58 @@ #include "SDCCmacro.h" #include "MySystem.h" #include "glue.h" +#include "dbuf_string.h" +#include //#include "gen.h" +#define OPTION_STACK_SIZE "--stack-size" +#define OPTION_UDATA_SECTION_NAME "--udata-section-name" + static char _defaultRules[] = { #include "peeph.rul" - "" }; +pic14_options_t pic14_options; +extern int debug_verbose; /* from pcode.c */ +extern char *udata_section_name; + +static OPTION _pic14_poptions[] = + { + { 0, "--debug-xtra", &debug_verbose, "show more debug info in assembly output" }, + { 0, "--no-pcode-opt", &pic14_options.disable_df, "disable (slightly faulty) optimization on pCode" }, + { 0, OPTION_STACK_SIZE, &options.stack_size, "sets the size if the argument passing stack (default: 16, minimum: 4)", CLAT_INTEGER }, + { 0, OPTION_UDATA_SECTION_NAME, &udata_section_name, "set udata section name", CLAT_STRING }, + { 0, NULL, NULL, NULL } + }; + /* list of key words used by pic14 */ static char *_pic14_keywords[] = { - "at", - //"bit", - "code", - "critical", - "data", - "far", - "idata", - "interrupt", - "near", - "pdata", - "reentrant", - "sfr", - //"sbit", - "using", - "xdata", - "_data", - "_code", - "_generic", - "_near", - "_xdata", - "_pdata", - "_idata", - NULL -}; - -pic14_options_t pic14_options; - -extern int debug_verbose; /* from pcode.c */ -static OPTION _pic14_poptions[] = { - { 0 , "--debug-xtra", &debug_verbose, "show more debug info in assembly output" }, - { 0 , "--no-pcode-opt", &pic14_options.disable_df, "disable (slightly faulty) optimization on pCode" }, - { 0 , NULL, NULL, NULL } + "at", + //"bit", + "code", + "critical", + "data", + "far", + "idata", + "interrupt", + "near", + "pdata", + "reentrant", + "sfr", + //"sbit", + "using", + "xdata", + "_data", + "_code", + "_generic", + "_near", + "_xdata", + "_pdata", + "_idata", + NULL }; void pCodeInitRegisters(void); @@ -66,114 +74,40 @@ void pic14_assignRegisters (ebbIndex *); /* for an unknowned reason. - EEP */ void pic14_emitDebuggerSymbol (char *); -static int regParmFlg = 0; /* determine if we can register a parameter */ +static int regParmFlg = 0; /* determine if we can register a parameter */ static void _pic14_init (void) { - asm_addTree (&asm_asxxxx_mapping); - memset (&pic14_options, 0, sizeof (pic14_options)); + asm_addTree (&asm_asxxxx_mapping); + memset (&pic14_options, 0, sizeof (pic14_options)); } static void _pic14_reset_regparm (void) { - regParmFlg = 0; + regParmFlg = 0; } static int _pic14_regparm (sym_link * l, bool reentrant) { /* for this processor it is simple - can pass only the first parameter in a register */ - //if (regParmFlg) - // return 0; - - regParmFlg++;// = 1; - return 1; -} - -static int -_process_pragma(const char *sz) -{ - static const char *WHITE = " \t"; - char *ptr = strtok((char *)sz, WHITE); - - if (startsWith (ptr, "memmap")) - { - char *start; - char *end; - char *type; - char *alias; - - start = strtok((char *)NULL, WHITE); - end = strtok((char *)NULL, WHITE); - type = strtok((char *)NULL, WHITE); - alias = strtok((char *)NULL, WHITE); - - if (start != (char *)NULL - && end != (char *)NULL - && type != (char *)NULL) { - value *startVal = constVal(start); - value *endVal = constVal(end); - value *aliasVal; - memRange r; - - if (alias == (char *)NULL) { - aliasVal = constVal(0); - } else { - aliasVal = constVal(alias); - } - - r.start_address = (int)floatFromVal(startVal); - r.end_address = (int)floatFromVal(endVal); - r.alias = (int)floatFromVal(aliasVal); - r.bank = (r.start_address >> 7) & 3; - - if (strcmp(type, "RAM") == 0) { - addMemRange(&r, 0); - } else if (strcmp(type, "SFR") == 0) { - addMemRange(&r, 1); - } else { - return 1; - } - } - - return 0; - } else if (startsWith (ptr, "maxram")) { - // not used any more - comes from device config file pic14devices.txt instead - return 0; - } - return 1; + can pass only the first parameter in a register */ + //if (regParmFlg) + // return 0; + + regParmFlg++;// = 1; + return 1; } -extern char *udata_section_name; - static bool _pic14_parseOptions (int *pargc, char **argv, int *i) { - char buf[128]; - - /* TODO: allow port-specific command line options to specify - * segment names here. - */ - - /* This is a temporary hack, to solve problems with some processors - * that do not have udata section. It will be changed when a more - * robust solution is figured out -- VR 27-11-2003 FIXME - */ - strcpy(buf, "--udata-section-name"); - if(!strncmp(buf, argv[ *i ], strlen(buf))) { - if(strlen(argv[ *i ]) <= strlen(buf)+1) { - fprintf(stderr, "WARNING: no `%s' entered\n", buf+2); - exit(EXIT_FAILURE); - } else { - udata_section_name = strdup( strchr(argv[*i], '=') + 1 ); - } - return 1; - } - - return FALSE; + /* TODO: allow port-specific command line options to specify + * segment names here. + */ + return FALSE; } extern set *dataDirsSet; @@ -211,64 +145,64 @@ _pic14_initPaths (void) static void _pic14_finaliseOptions (void) { - pCodeInitRegisters(); - - port->mem.default_local_map = data; - port->mem.default_globl_map = data; + pCodeInitRegisters(); + + port->mem.default_local_map = data; + port->mem.default_globl_map = data; #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. */ + /* 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. - */ + 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; - port->mem.default_globl_map = xdata; - } - else - { - port->mem.default_local_map = data; - port->mem.default_globl_map = data; - } - - if (options.stack10bit) - { - if (options.model != MODEL_FLAT24) - { - fprintf (stderr, - "*** warning: 10 bit stack mode is only supported in flat24 model.\n"); - fprintf (stderr, "\t10 bit stack mode disabled.\n"); - options.stack10bit = 0; - } - else - { - /* Fixup the memory map for the stack; it is now in - * far space and requires a FPOINTER to access it. - */ - istack->fmap = 1; - istack->ptrType = FPOINTER; - } - } + fReturn = fReturn390; + fReturnSize = 5; + } + + if (options.model == MODEL_LARGE) + { + port->mem.default_local_map = xdata; + port->mem.default_globl_map = xdata; + } + else + { + port->mem.default_local_map = data; + port->mem.default_globl_map = data; + } + + if (options.stack10bit) + { + if (options.model != MODEL_FLAT24) + { + fprintf (stderr, + "*** warning: 10 bit stack mode is only supported in flat24 model.\n"); + fprintf (stderr, "\t10 bit stack mode disabled.\n"); + options.stack10bit = 0; + } + else + { + /* Fixup the memory map for the stack; it is now in + * far space and requires a FPOINTER to access it. + */ + istack->fmap = 1; + istack->ptrType = FPOINTER; + } + } #endif } @@ -280,9 +214,9 @@ _pic14_setDefaultOptions (void) static const char * _pic14_getRegName (struct regs *reg) { - if (reg) - return reg->name; - return "err"; + if (reg) + return reg->name; + return "err"; } extern char *processor_base_name(void); @@ -290,47 +224,47 @@ extern char *processor_base_name(void); static void _pic14_genAssemblerPreamble (FILE * of) { - char * name = processor_base_name(); - - if(!name) { - - name = "16f877"; - fprintf(stderr,"WARNING: No Pic has been selected, defaulting to %s\n",name); - } - - fprintf (of, "\tlist\tp=%s\n",name); - fprintf (of, "\tradix dec\n"); - fprintf (of, "\tinclude \"p%s.inc\"\n",name); + char * name = processor_base_name(); + + if(!name) { + + name = "16f877"; + fprintf(stderr,"WARNING: No Pic has been selected, defaulting to %s\n",name); + } + + fprintf (of, "\tlist\tp=%s\n",name); + fprintf (of, "\tradix dec\n"); + fprintf (of, "\tinclude \"p%s.inc\"\n",name); } /* Generate interrupt vector table. */ static int -_pic14_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) +_pic14_genIVT (struct dbuf_s * oBuf, symbol ** interrupts, int maxInterrupts) { - int i; - - if (options.model != MODEL_FLAT24) - { - /* Let the default code handle it. */ - return FALSE; - } - - fprintf (of, "\t;ajmp\t__sdcc_gsinit_startup\n"); - - /* now for the other interrupts */ - for (i = 0; i < maxInterrupts; i++) - { - if (interrupts[i]) - { - fprintf (of, "\t;ljmp\t%s\n\t.ds\t4\n", interrupts[i]->rname); - } - else - { - fprintf (of, "\t;reti\n\t.ds\t7\n"); - } - } - - return TRUE; + int i; + + if (options.model != MODEL_FLAT24) + { + /* Let the default code handle it. */ + return FALSE; + } + + dbuf_printf (oBuf, "\t;ajmp\t__sdcc_gsinit_startup\n"); + + /* now for the other interrupts */ + for (i = 0; i < maxInterrupts; i++) + { + if (interrupts[i]) + { + dbuf_printf (oBuf, "\t;ljmp\t%s\n\t.ds\t4\n", interrupts[i]->rname); + } + else + { + dbuf_printf (oBuf, "\t;reti\n\t.ds\t7\n"); + } + } + + return TRUE; } static bool @@ -339,93 +273,93 @@ _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right) /* sym_link *test = NULL; value *val; - */ - - //fprintf(stderr,"checking for native mult\n"); - - if ( ic->op != '*') - { - return FALSE; - } - - /* multiply chars in-place */ - if (getSize(left) == 1 && getSize(right) == 1) - return TRUE; - - /* use library functions for more complex maths */ - return FALSE; - - /* - if ( IS_LITERAL (left)) - { - fprintf(stderr,"left is lit\n"); - test = left; - val = OP_VALUE (IC_LEFT (ic)); - } - else if ( IS_LITERAL (right)) - { - fprintf(stderr,"right is lit\n"); - test = left; - val = OP_VALUE (IC_RIGHT (ic)); - } - else - { - fprintf(stderr,"oops, neither is lit so no\n"); - return FALSE; - } - - if ( getSize (test) <= 2) - { - fprintf(stderr,"yep\n"); - return TRUE; - } - fprintf(stderr,"nope\n"); - - return FALSE; - */ + */ + + //fprintf(stderr,"checking for native mult\n"); + + if ( ic->op != '*') + { + return FALSE; + } + + /* multiply chars in-place */ + if (getSize(left) == 1 && getSize(right) == 1) + return TRUE; + + /* use library functions for more complex maths */ + return FALSE; + + /* + if ( IS_LITERAL (left)) + { + fprintf(stderr,"left is lit\n"); + test = left; + val = OP_VALUE (IC_LEFT (ic)); + } + else if ( IS_LITERAL (right)) + { + fprintf(stderr,"right is lit\n"); + test = left; + val = OP_VALUE (IC_RIGHT (ic)); + } + else + { + fprintf(stderr,"oops, neither is lit so no\n"); + return FALSE; + } + + if ( getSize (test) <= 2) + { + fprintf(stderr,"yep\n"); + return TRUE; + } + fprintf(stderr,"nope\n"); + + return FALSE; + */ } /* Indicate which extended bit operations this port supports */ static bool hasExtBitOp (int op, int size) { - if (op == RRC - || op == RLC - /* || op == GETHBIT */ /* GETHBIT doesn't look complete for PIC */ - ) - return TRUE; - else - return FALSE; + if (op == RRC + || op == RLC + /* || op == GETHBIT */ /* GETHBIT doesn't look complete for PIC */ + ) + return TRUE; + else + return FALSE; } /* Indicate the expense of an access to an output storage class */ static int oclsExpense (struct memmap *oclass) { - /* The IN_FARSPACE test is compatible with historical behaviour, */ - /* but I don't think it is applicable to PIC. If so, please feel */ - /* free to remove this test -- EEP */ - if (IN_FARSPACE(oclass)) - return 1; + /* The IN_FARSPACE test is compatible with historical behaviour, */ + /* but I don't think it is applicable to PIC. If so, please feel */ + /* free to remove this test -- EEP */ + if (IN_FARSPACE(oclass)) + return 1; - return 0; + return 0; } /** $1 is always the basename. -$2 is always the output file. -$3 varies -$l is the list of extra options that should be there somewhere... -MUST be terminated with a NULL. + $2 is always the output file. + $3 varies + $l is the list of extra options that should be there somewhere... + MUST be terminated with a NULL. */ static const char *_linkCmd[] = { - "gplink", "$l", "-o \"$2\"", "\"$1\"", "$3", NULL + "gplink", "$l", "-w", "-r", "-o \"$2\"", "\"$1\"", "$3", NULL }; static const char *_asmCmd[] = { - "gpasm", "$l", "-c", "\"$1.asm\"", NULL - + "gpasm", "$l", "$3", "-c", "\"$1.asm\"", NULL + }; extern set *libFilesSet; @@ -453,7 +387,7 @@ static void _pic14_do_link (void) * */ - sprintf(lfrm, "{linker} {incdirs} {sysincdirs} {lflags} -o {outfile} {user_ofile} {spec_ofiles} {ofiles} {libs}"); + sprintf(lfrm, "{linker} {incdirs} {sysincdirs} {lflags} -w -r -o {outfile} {user_ofile} {spec_ofiles} {ofiles} {libs}"); shash_add(&linkValues, "linker", "gplink"); @@ -468,10 +402,10 @@ static void _pic14_do_link (void) shash_add(&linkValues, "lflags", joinStrSet(linkOptionsSet)); - shash_add(&linkValues, "outfile", dstFileName); + shash_add(&linkValues, "outfile", fullDstFileName ? fullDstFileName : dstFileName); if(fullSrcFileName) { - sprintf(temp, "%s.o", dstFileName); + sprintf(temp, "%s.o", fullDstFileName ? fullDstFileName : dstFileName ); shash_add(&linkValues, "user_ofile", temp); } @@ -482,7 +416,7 @@ static void _pic14_do_link (void) if (!procName) { procName = "16f877"; } - + addSet(&libFilesSet, "libsdcc.lib"); SNPRINTF(&temp[0], 128, "pic%s.lib", procName); addSet(&libFilesSet, temp); @@ -501,125 +435,128 @@ static void _pic14_do_link (void) /* Globals */ PORT pic_port = { - TARGET_ID_PIC, - "pic14", - "MCU pic", /* Target name */ - "", /* Processor */ - { - picglue, - TRUE, /* Emit glue around main */ - MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24, - MODEL_SMALL - }, - { - _asmCmd, - NULL, - NULL, - NULL, - //"-plosgffc", /* Options with debug */ - //"-plosgff", /* Options without debug */ - 0, - ".asm", - NULL /* no do_assemble function */ - }, - { - _linkCmd, - NULL, - _pic14_do_link, /* own do link function */ - ".o", - 0 - }, - { - _defaultRules - }, - { - /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ - 1, 2, 2, 4, 2, 2, 3, 1, 4, 4 - /* TSD - I changed the size of gptr from 3 to 1. However, it should be - 2 so that we can accomodate the PIC's with 4 register banks (like the - 16f877) - */ - }, - /* tags for generic pointers */ - { 0x00, 0x00, 0x00, 0x80 }, /* far, near, xstack, code */ - { - "XSEG (XDATA)", - "STACK (DATA)", - "code", - "DSEG (DATA)", - "ISEG (DATA)", - NULL, /* pdata */ - "XSEG (XDATA)", - "BSEG (BIT)", - "RSEG (DATA)", - "GSINIT (CODE)", - "udata_ovr", - "GSFINAL (CODE)", - "HOME (CODE)", - NULL, // xidata - NULL, // xinit - "CONST (CODE)", // const_name - const data (code or not) - NULL, - NULL, - 1 // code is read only - }, - { NULL, NULL }, - { - +1, 1, 4, 1, 1, 0 - }, - /* pic14 has an 8 bit mul */ - { - 1, -1 - }, - { - pic14_emitDebuggerSymbol - }, - { - 255/3, /* maxCount */ - 3, /* sizeofElement */ - /* The rest of these costs are bogus. They approximate */ - /* the behavior of src/SDCCicode.c 1.207 and earlier. */ - {4,4,4}, /* sizeofMatchJump[] */ - {0,0,0}, /* sizeofRangeCompare[] */ - 0, /* sizeofSubtract */ - 3, /* sizeofDispatch */ - }, - "_", - _pic14_init, - _pic14_parseOptions, - _pic14_poptions, - _pic14_initPaths, - _pic14_finaliseOptions, - _pic14_setDefaultOptions, - pic14_assignRegisters, - _pic14_getRegName, - _pic14_keywords, - _pic14_genAssemblerPreamble, - NULL, /* no genAssemblerEnd */ - _pic14_genIVT, - NULL, // _pic14_genXINIT - NULL, /* genInitStartup */ - _pic14_reset_regparm, - _pic14_regparm, - _process_pragma, /* process a pragma */ - NULL, - _hasNativeMulFor, - hasExtBitOp, /* hasExtBitOp */ - oclsExpense, /* oclsExpense */ - FALSE, -// TRUE, /* little endian */ - FALSE, /* little endian - PIC code enumlates big endian */ - 0, /* leave lt */ - 0, /* leave gt */ - 1, /* transform <= to ! > */ - 1, /* transform >= to ! < */ - 1, /* transform != to !(a == b) */ - 0, /* leave == */ - FALSE, /* No array initializer support. */ - 0, /* no CSE cost estimation yet */ - NULL, /* no builtin functions */ - GPOINTER, /* treat unqualified pointers as "generic" pointers */ - 1, /* reset labelKey to 1 */ - 1, /* globals & local static allowed */ - PORT_MAGIC + TARGET_ID_PIC, + "pic14", + "MCU pic", /* Target name */ + "", /* Processor */ + { + picglue, + TRUE, /* Emit glue around main */ + MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24, + MODEL_SMALL + }, + { + _asmCmd, + NULL, + "-g", /* options with --debug */ + NULL, /* options without --debug */ + //"-plosgffc", /* Options with debug */ + //"-plosgff", /* Options without debug */ + 0, + ".asm", + NULL /* no do_assemble function */ + }, + { + _linkCmd, + NULL, + _pic14_do_link, /* own do link function */ + ".o", + 0 + }, + { + _defaultRules + }, + { + /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ + 1, 2, 2, 4, 2, 2, 3, 1, 4, 4 + /* TSD - I changed the size of gptr from 3 to 1. However, it should be + 2 so that we can accomodate the PIC's with 4 register banks (like the + 16f877) + */ + }, + /* tags for generic pointers */ + { 0x00, 0x00, 0x00, 0x80 }, /* far, near, xstack, code */ + { + "XSEG (XDATA)", + "STACK (DATA)", + "code", + "DSEG (DATA)", + "ISEG (DATA)", + NULL, /* pdata */ + "XSEG (XDATA)", + "BSEG (BIT)", + "RSEG (DATA)", + "GSINIT (CODE)", + "udata_ovr", + "GSFINAL (CODE)", + "HOME (CODE)", + NULL, // xidata + NULL, // xinit + "CONST (CODE)", // const_name - const data (code or not) + "CABS (ABS,CODE)", // cabs_name - const absolute data (code or not) + "XABS (ABS,XDATA)", // xabs_name - absolute xdata + "IABS (ABS,DATA)", // iabs_name - absolute data + NULL, + NULL, + 1 // code is read only + }, + { NULL, NULL }, + { + +1, 1, 4, 1, 1, 0 + }, + /* pic14 has an 8 bit mul */ + { + 1, -1 + }, + { + pic14_emitDebuggerSymbol + }, + { + 255/3, /* maxCount */ + 3, /* sizeofElement */ + /* The rest of these costs are bogus. They approximate */ + /* the behavior of src/SDCCicode.c 1.207 and earlier. */ + {4,4,4}, /* sizeofMatchJump[] */ + {0,0,0}, /* sizeofRangeCompare[] */ + 0, /* sizeofSubtract */ + 3, /* sizeofDispatch */ + }, + "_", + _pic14_init, + _pic14_parseOptions, + _pic14_poptions, + _pic14_initPaths, + _pic14_finaliseOptions, + _pic14_setDefaultOptions, + pic14_assignRegisters, + _pic14_getRegName, + _pic14_keywords, + _pic14_genAssemblerPreamble, + NULL, /* no genAssemblerEnd */ + _pic14_genIVT, + NULL, // _pic14_genXINIT + NULL, /* genInitStartup */ + _pic14_reset_regparm, + _pic14_regparm, + NULL, /* process a pragma */ + NULL, + _hasNativeMulFor, + hasExtBitOp, /* hasExtBitOp */ + oclsExpense, /* oclsExpense */ + FALSE, +// TRUE, /* little endian */ + FALSE, /* little endian - PIC code enumlates big endian */ + 0, /* leave lt */ + 0, /* leave gt */ + 1, /* transform <= to ! > */ + 1, /* transform >= to ! < */ + 1, /* transform != to !(a == b) */ + 0, /* leave == */ + FALSE, /* No array initializer support. */ + 0, /* no CSE cost estimation yet */ + NULL, /* no builtin functions */ + GPOINTER, /* treat unqualified pointers as "generic" pointers */ + 1, /* reset labelKey to 1 */ + 1, /* globals & local static allowed */ + PORT_MAGIC };