From 976b6c5e009dbfffa9e8281f1af2b17a959de5ad Mon Sep 17 00:00:00 2001 From: MaartenBrock Date: Sun, 23 Jul 2006 18:24:59 +0000 Subject: [PATCH] * device/include/mcs51/compiler.h: added SFRX for xdata based special function registers and corrected defaults with additional warning * device/lib/malloc.c: cosmetic changes * device/lib/realloc.c: bugfix for bug #1496907, Thanks Efim Monyak * src/ds390/ralloc.c (getRegBitNoSpil): reenabled, (fillGaps): and used it git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4295 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 9 +++++++ device/include/mcs51/compiler.h | 43 ++++++++++++++++++++++----------- device/lib/malloc.c | 34 +++++++++++++------------- device/lib/realloc.c | 5 ++++ src/ds390/ralloc.c | 7 +++--- 5 files changed, 63 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 65642edc..9a1ab373 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-07-23 Maarten Brock + + * device/include/mcs51/compiler.h: added SFRX for xdata based special + function registers and corrected defaults with additional warning + * device/lib/malloc.c: cosmetic changes + * device/lib/realloc.c: bugfix for bug #1496907, Thanks Efim Monyak + * src/ds390/ralloc.c (getRegBitNoSpil): reenabled, + (fillGaps): and used it + 2006-07-20 Raphael Neider * src/pic/device.c (addMemRange,assignRegister): suppress verbose diff --git a/device/include/mcs51/compiler.h b/device/include/mcs51/compiler.h index 3886d7ae..149826dd 100644 --- a/device/include/mcs51/compiler.h +++ b/device/include/mcs51/compiler.h @@ -30,6 +30,8 @@ * prerequisite byte order or adjacency. None of these multi-byte sfr * combinations will guarantee the order in which they are accessed when read * or written. + * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined + * to avoid portability issues because of compiler endianness. * This file is to be included in every microcontroller specific header file. * Example: * @@ -40,6 +42,8 @@ * * SFR (P0, 0x80); // Port 0 * + * SFRX (CPUCS, 0xE600); // Cypress FX2 Control and Status register in xdata memory at 0xE600 + * * SFR16 (TMR2, 0xCC); // Timer 2, lsb at 0xCC, msb at 0xCD * * SFR16E(TMR0, 0x8C8A); // Timer 0, lsb at 0x8A, msb at 0x8C @@ -47,6 +51,7 @@ * SFR32 (MAC0ACC, 0x93); // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96 * * SFR32E(SUMR, 0xE5E4E3E2); // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5 + * */ #ifndef COMPILER_H @@ -56,12 +61,13 @@ * http://sdcc.sf.net */ #if defined SDCC -# define SBIT(name, addr, bit) __sbit __at(addr+bit) name -# define SFR(name, addr) __sfr __at(addr) name -# define SFR16(name, addr) __sfr16 __at(((addr+1)<<8) | addr) name -# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name +# define SBIT(name, addr, bit) __sbit __at(addr+bit) name +# define SFR(name, addr) __sfr __at(addr) name +# define SFRX(name, addr) xdata volatile unsigned char __at(addr) name +# define SFR16(name, addr) __sfr16 __at(((addr+1)<<8) | addr) name +# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name # define SFR32(name, addr) __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name -# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr) name +# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr) name /** Keil C51 * http://www.keil.com @@ -69,6 +75,7 @@ #elif defined __CX51__ # define SBIT(name, addr, bit) sbit name = addr^bit # define SFR(name, addr) sfr name = addr +# define SFRX(name, addr) volatile unsigned char xdata name _at_ addr # define SFR16(name, addr) sfr16 name = addr # define SFR16E(name, fulladdr) /* not supported */ # define SFR32(name, fulladdr) /* not supported */ @@ -78,9 +85,10 @@ * http://www.raisonance.com */ #elif defined __RC51__ -# define SBIT(name, addr, bit) at (addr+bit) sbit name -# define SFR(name, addr) sfr at addr name -# define SFR16(name, addr) sfr16 at addr name +# define SBIT(name, addr, bit) at (addr+bit) sbit name +# define SFR(name, addr) sfr at addr name +# define SFRX(name, addr) xdata at addr volatile unsigned char name +# define SFR16(name, addr) sfr16 at addr name # define SFR16E(name, fulladdr) /* not supported */ # define SFR32(name, fulladdr) /* not supported */ # define SFR32E(name, fulladdr) /* not supported */ @@ -91,6 +99,7 @@ #elif defined __ICC8051__ # define SBIT(name, addr, bit) __bit __no_init volatile bool name @ (addr+bit) # define SFR(name, addr) __sfr __no_init volatile unsigned char name @ addr +# define SFRX(name, addr) __xdata __no_init volatile unsigned char name @ addr # define SFR16(name, addr) __sfr __no_init volatile unsigned int name @ addr # define SFR16E(name, fulladdr) /* not supported */ # define SFR32(name, fulladdr) __sfr __no_init volatile unsigned long name @ addr @@ -102,6 +111,7 @@ #elif defined _CC51 # define SBIT(name, addr, bit) _sfrbit name _at(addr+bit) # define SFR(name, addr) _sfrbyte name _at(addr) +# define SFRX(name, addr) _xdat volatile unsigned char name _at(addr) # define SFR16(name, addr) /* not supported */ # define SFR16E(name, fulladdr) /* not supported */ # define SFR32(name, fulladdr) /* not supported */ @@ -113,6 +123,7 @@ #elif defined HI_TECH_C # define SBIT(name, addr, bit) volatile bit name @ (addr+bit) # define SFR(name, addr) volatile unsigned char name @ addr +# define SFRX(name, addr) volatile far unsigned char name @ addr # define SFR16(name, addr) /* not supported */ # define SFR16E(name, fulladdr) /* not supported */ # define SFR32(name, fulladdr) /* not supported */ @@ -124,6 +135,7 @@ #elif defined _XC51_VER # define SBIT(name, addr, bit) _sfrbit name = (addr+bit) # define SFR(name, addr) _sfr name = addr +# define SFRX(name, addr) volatile unsigned char _xdata name _at addr # define SFR16(name, addr) _sfrword name = addr # define SFR16E(name, fulladdr) /* not supported */ # define SFR32(name, fulladdr) /* not supported */ @@ -135,6 +147,7 @@ #elif defined __UC__ # define SBIT(name, addr, bit) unsigned char bit name @ (addr+bit) # define SFR(name, addr) near unsigned char name @ addr +# define SFRX(name, addr) xdata volatile unsigned char name @ addr # define SFR16(name, addr) /* not supported */ # define SFR16E(name, fulladdr) /* not supported */ # define SFR32(name, fulladdr) /* not supported */ @@ -144,12 +157,14 @@ * unknown compiler */ #elif -# define SBIT(name, addr, bit) volatile bool -# define SFR(name, addr) volatile unsigned char -# define SFR16(name, addr) volatile short -# define SFR16E(name, fulladdr) volatile short -# define SFR32(name, fulladdr) volatile int -# define SFR32E(name, fulladdr) volatile int +# warning unknown compiler +# define SBIT(name, addr, bit) volatile bool name +# define SFR(name, addr) volatile unsigned char name +# define SFRX(name, addr) volatile unsigned char name +# define SFR16(name, addr) volatile unsigned short name +# define SFR16E(name, fulladdr) volatile unsigned short name +# define SFR32(name, fulladdr) volatile unsigned long name +# define SFR32E(name, fulladdr) volatile unsigned long name #endif diff --git a/device/lib/malloc.c b/device/lib/malloc.c index 4754095c..c1e5a44d 100644 --- a/device/lib/malloc.c +++ b/device/lib/malloc.c @@ -102,27 +102,27 @@ malloc (unsigned int size) if (ret) { - if (!current_header->len) - { //This code works only for first_header in the list and only - current_header->len = size; //for first allocation - } - else - { - //else create new header at the begin of spare - new_header = (MEMHEADER * )((char *)current_header + current_header->len); - new_header->next = current_header->next; //and plug it into the chain - new_header->prev = current_header; - current_header->next = new_header; - if (new_header->next) - { - new_header->next->prev = new_header; + if (!current_header->len) + { //This code works only for first_header in the list and only + current_header->len = size; //for first allocation } - new_header->len = size; //mark as used + else + { + //else create new header at the begin of spare + new_header = (MEMHEADER * )((char *)current_header + current_header->len); + new_header->next = current_header->next; //and plug it into the chain + new_header->prev = current_header; + current_header->next = new_header; + if (new_header->next) + { + new_header->next->prev = new_header; + } + new_header->len = size; //mark as used ret = &new_header->mem; + } } } -} - return ret; + return ret; } #else diff --git a/device/lib/realloc.c b/device/lib/realloc.c index c41ff866..0702e3b7 100644 --- a/device/lib/realloc.c +++ b/device/lib/realloc.c @@ -97,6 +97,11 @@ void xdata * realloc (void * p, size_t size) { pnew = (MEMHEADER xdata * )((char xdata *)_sdcc_prev_memheader + _sdcc_prev_memheader->len); _sdcc_prev_memheader->next = pnew; + +#if _SDCC_MALLOC_TYPE_MLH + pthis->next->prev = pnew; +#endif + memmove(pnew, pthis, pthis->len); pnew->len = size; ret = MEM(pnew); diff --git a/src/ds390/ralloc.c b/src/ds390/ralloc.c index f69b12c2..a6dfae4c 100644 --- a/src/ds390/ralloc.c +++ b/src/ds390/ralloc.c @@ -124,8 +124,7 @@ allocReg (short type) currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, i); return ®s390[i]; } - /* otherwise look for specific type - of register */ + /* otherwise look for specific type of register */ if (regs390[i].isFree && regs390[i].type == type) { @@ -959,7 +958,6 @@ static regs *getRegGprNoSpil() /*-----------------------------------------------------------------*/ /* getRegBitNoSpil - get it cannot be spilt */ /*-----------------------------------------------------------------*/ -#if 0 static regs *getRegBitNoSpil() { regs *reg; @@ -977,7 +975,6 @@ static regs *getRegBitNoSpil() /* just to make the compiler happy */ return 0; } -#endif /*-----------------------------------------------------------------*/ /* symHasReg - symbol has a given register */ @@ -1671,6 +1668,8 @@ static void fillGaps() for (i=0; i < sym->nRegs ; i++ ) { if (sym->regType == REG_PTR) sym->regs[i] = getRegPtrNoSpil (); + else if (sym->regType == REG_BIT) + sym->regs[i] = getRegBitNoSpil (); else sym->regs[i] = getRegGprNoSpil (); } -- 2.30.2