X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Favr%2Fmain.c;h=efde4d2beaef53048b1dd4eb7b1471ae7c74d8be;hb=5a1d5e778e85664f4e6657019348b4756b16eacb;hp=45be337b621adc01b86b159dc626cefac39e32ef;hpb=0abb805fd2d72a89b41a10144ded610ebfc072bc;p=fw%2Fsdcc diff --git a/src/avr/main.c b/src/avr/main.c index 45be337b..efde4d2b 100644 --- a/src/avr/main.c +++ b/src/avr/main.c @@ -9,115 +9,149 @@ #include "ralloc.h" #include "gen.h" -static char _defaultRules[] = -{ +static char _defaultRules[] = { #include "peeph.rul" }; /* list of key words used by msc51 */ -static char *_avr_keywords[] = { - "at", - "code", - "critical", - "eeprom", - "interrupt", - "sfr", - "sbit", - "xdata", - "_code", - "_eeprom", - "_generic", - "_xdata", - "sram" , - "_sram", - "flash", - "_flash", - NULL +static char *_avr_keywords[] = { + "at", + "code", + "critical", + "eeprom", + "interrupt", + "sfr", + "xdata", + "_code", + "_eeprom", + "_generic", + "_xdata", + "sram", + "_sram", + "flash", + "_flash", + NULL }; -static int regParmFlg = 0; /* determine if we can register a parameter */ +static int regParmFlg = 0; /* determine if we can register a parameter */ -static void _avr_init(void) +static void +_avr_init (void) { - asm_addTree(&asm_asxxxx_mapping); + asm_addTree (&asm_asxxxx_mapping); } -static void _avr_reset_regparm() +static void +_avr_reset_regparm (void) { - regParmFlg = 0; + regParmFlg = 0; } -static int _avr_regparm( link *l) +static int +_avr_regparm (sym_link * l, bool reentrant) { - /* the first eight bytes will be passed in - registers r16-r23. but we won't split variables - i.e. if not enough registers left to hold - the parameter then the whole parameter along - with rest of the parameters go onto the stack */ - if (regParmFlg < 8 ) { - int size ; - if ((size = getSize(l)) > (8 - regParmFlg)) { - /* all remaining go on stack */ - regParmFlg = 8; - return 0; + /* the first eight bytes will be passed in + registers r16-r23. but we won't split variables + i.e. if not enough registers left to hold + the parameter then the whole parameter along + with rest of the parameters go onto the stack */ + if (regParmFlg < 8) { + int size; + if ((size = getSize (l)) > (8 - regParmFlg)) { + /* all remaining go on stack */ + regParmFlg = 8; + return 0; + } + regParmFlg += size; + return 1; } - regParmFlg += size; - return 1; - } - - return 0; + + return 0; } -void avr_assignRegisters (eBBlock **ebbs, int count); +void avr_assignRegisters (ebbIndex *); -static bool _avr_parseOptions(int *pargc, char **argv, int *i) +static bool +_avr_parseOptions (int *pargc, char **argv, int *i) { - /* TODO: allow port-specific command line options to specify - * segment names here. - */ - return FALSE; + /* TODO: allow port-specific command line options to specify + * segment names here. + */ + return FALSE; } -static void _avr_finaliseOptions(void) +static void +_avr_finaliseOptions (void) { - port->mem.default_local_map = - port->mem.default_globl_map = xdata; - /* change stack to be in far space */ - /* internal stack segment ; - SFRSPACE - NO - FAR-SPACE - YES - PAGED - NO - DIRECT-ACCESS - NO - BIT-ACCESS - NO - CODE-ACESS - NO - DEBUG-NAME - 'B' - POINTER-TYPE - POINTER - */ - istack = allocMap (0, 1, 0, 0, 0, 0,options.stack_loc, ISTACK_NAME,'B',FPOINTER); + port->mem.default_local_map = port->mem.default_globl_map = xdata; + /* change stack to be in far space */ + /* internal stack segment ; + SFRSPACE - NO + FAR-SPACE - YES + PAGED - NO + DIRECT-ACCESS - NO + BIT-ACCESS - NO + CODE-ACESS - NO + DEBUG-NAME - 'B' + POINTER-TYPE - FPOINTER + */ + istack = + allocMap (0, 1, 0, 0, 0, 0, options.stack_loc, ISTACK_NAME, + 'B', FPOINTER); + + /* also change xdata to be direct space since we can use lds/sts */ + xdata->direct = 1; } -static void _avr_setDefaultOptions(void) +static void +_avr_setDefaultOptions (void) { - options.stackAuto = 1; + options.stackAuto = 1; } -static const char *_avr_getRegName(struct regs *reg) +static const char * +_avr_getRegName (struct regs *reg) { - if (reg) - return reg->name; - return "err"; + if (reg) + return reg->name; + return "err"; } -static void _avr_genAssemblerPreamble(FILE *of) +static void +_avr_genAssemblerPreamble (FILE * of) { } /* Generate interrupt vector table. */ -static int _avr_genIVT(FILE *of, symbol **interrupts, int maxInterrupts) +static int +_avr_genIVT (struct dbuf_s * oBuf, symbol ** interrupts, int maxInterrupts) +{ + return TRUE; +} + +/* Indicate which extended bit operations this port supports */ +static bool +hasExtBitOp (int op, int size) { + if (op == RRC + || op == RLC + || op == GETHBIT + ) return TRUE; + else + return FALSE; +} + +/* Indicate the expense of an access to an output storage class */ +static int +oclsExpense (struct memmap *oclass) +{ + if (IN_FARSPACE(oclass)) + return 1; + + return 0; } /** $1 is always the basename. @@ -127,76 +161,129 @@ static int _avr_genIVT(FILE *of, symbol **interrupts, int maxInterrupts) MUST be terminated with a NULL. */ static const char *_linkCmd[] = { - "aslink", "-nf", "$1", NULL + "linkavr", "", "\"$1\"", NULL }; +/* $3 is replaced by assembler.debug_opts resp. port->assembler.plain_opts */ static const char *_asmCmd[] = { - "asx8051", "-plosgffc", "$1.asm", NULL + "asavr", "$l" , "$3", "\"$1.s\"", NULL }; /* Globals */ PORT avr_port = { - "avr", - "ATMEL AVR", /* Target name */ - { - TRUE, /* Emit glue around main */ - MODEL_LARGE | MODEL_SMALL, - MODEL_SMALL - }, - { - _asmCmd, - "-plosgffc", /* Options with debug */ - "-plosgff", /* Options without debug */ - 0 - }, - { - _linkCmd, + TARGET_ID_AVR, + "avr", + "ATMEL AVR", /* Target name */ + NULL, /* processor */ + { + glue, + TRUE, /* Emit glue around main */ + MODEL_LARGE | MODEL_SMALL, + MODEL_SMALL + }, + { + _asmCmd, + NULL, + "-plosgff", /* Options with debug */ + "-plosgff", /* Options without debug */ + 0, + ".s", + NULL, /* no do_assemble */ + }, + { + _linkCmd, + NULL, + NULL, + ".rel", + 1}, + { + _defaultRules}, + { + /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ + 1, 2, 2, 4, 2, 2, 3, 1, 4, 4}, + + /* tags for generic pointers */ + { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */ + + { + "XSEG", + "STACK", + "CSEG", + "DSEG", + "ISEG", + NULL, //PSEG + "XSEG", + "BSEG", + "RSEG", + "GSINIT", + "OSEG", + "GSFINAL", + "HOME", + NULL, // initialized xdata + NULL, // a code copy of xiseg + "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/pdata + "IABS (ABS,DATA)", // iabs_name - absolute idata/data + NULL, + NULL, + 0, + }, + { NULL, NULL }, + { + -1, 1, 4, 1, 1, 0}, + /* avr has an 8 bit mul */ + { + 1, -1 + }, + { + avr_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 */ + }, + "_", + _avr_init, + _avr_parseOptions, NULL, - ".rel" - }, - { - _defaultRules - }, - { - /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ - 1, 1, 2, 4, 2, 2, 3, 1, 4, 4 - }, - { - "XSEG (XDATA)", - "STACK (DATA)", - "CSEG (CODE)", - "DSEG (DATA)", - "ISEG (DATA)", - "XSEG (XDATA)", - "BSEG (BIT)", - "RSEG (DATA)", - "GSINIT (CODE)", - "OSEG (OVR,DATA)", - "GSFINAL (CODE)", - "HOME (CODE)", NULL, + _avr_finaliseOptions, + _avr_setDefaultOptions, + avr_assignRegisters, + _avr_getRegName, + _avr_keywords, + _avr_genAssemblerPreamble, + NULL, /* no genAssemblerEnd */ + _avr_genIVT, + NULL, // _avr_genXINIT + NULL, /* genInitStartup */ + _avr_reset_regparm, + _avr_regparm, + NULL, NULL, - 0, - }, - { - -1, 1, 4, 1, 1, 0 - }, - /* avr has an 8 bit mul */ - { - 1 - }, - "_", - _avr_init, - _avr_parseOptions, - _avr_finaliseOptions, - _avr_setDefaultOptions, - avr_assignRegisters, - _avr_getRegName , - _avr_keywords, - _avr_genAssemblerPreamble, - _avr_genIVT, - _avr_reset_regparm, - _avr_regparm, - FALSE + NULL, + hasExtBitOp, /* hasExtBitOp */ + oclsExpense, /* oclsExpense */ + FALSE, + TRUE, /* little endian */ + 0, /* leave lt */ + 1, /* transform gt ==> not le */ + 0, /* leave le */ + 0, /* leave ge */ + 0, /* leave != */ + 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 }; -