* device/include/mcs51/compiler.h: added SFRX for xdata based special
authorMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 23 Jul 2006 18:24:59 +0000 (18:24 +0000)
committerMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 23 Jul 2006 18:24:59 +0000 (18:24 +0000)
  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
device/include/mcs51/compiler.h
device/lib/malloc.c
device/lib/realloc.c
src/ds390/ralloc.c

index 65642edcb0c32eb15889007e44bdddb8547b770b..9a1ab373102eed6409ad4c1cca2f6fe7b8fc874e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-07-23 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * 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 <rneider AT web.de>
 
        * src/pic/device.c (addMemRange,assignRegister): suppress verbose
index 3886d7aee73202f80525e5dea910e6615e74a462..149826dd4d179fc6285324195ff4d4f42061793f 100644 (file)
@@ -30,6 +30,8 @@
   * prerequisite byte order or adjacency. None of these multi-byte sfr\r
   * combinations will guarantee the order in which they are accessed when read\r
   * or written.\r
+  * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined\r
+  * to avoid portability issues because of compiler endianness.\r
   * This file is to be included in every microcontroller specific header file.\r
   * Example:\r
   *\r
@@ -40,6 +42,8 @@
   *\r
   * SFR   (P0, 0x80);           // Port 0\r
   *\r
+  * SFRX  (CPUCS, 0xE600);      // Cypress FX2 Control and Status register in xdata memory at 0xE600\r
+  *\r
   * SFR16 (TMR2, 0xCC);         // Timer 2, lsb at 0xCC, msb at 0xCD\r
   *\r
   * SFR16E(TMR0, 0x8C8A);       // Timer 0, lsb at 0x8A, msb at 0x8C\r
@@ -47,6 +51,7 @@
   * SFR32 (MAC0ACC, 0x93);      // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96\r
   *\r
   * SFR32E(SUMR, 0xE5E4E3E2);   // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5\r
+  *\r
  */\r
 \r
 #ifndef COMPILER_H\r
   * http://sdcc.sf.net\r
  */\r
 #if defined SDCC\r
-# define SBIT(name, addr, bit)  __sbit  __at(addr+bit)             name\r
-# define SFR(name, addr)        __sfr   __at(addr)                 name\r
-# define SFR16(name, addr)      __sfr16 __at(((addr+1)<<8) | addr) name\r
-# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr)             name\r
+# define SBIT(name, addr, bit)  __sbit  __at(addr+bit)                  name\r
+# define SFR(name, addr)        __sfr   __at(addr)                      name\r
+# define SFRX(name, addr)       xdata volatile unsigned char __at(addr) name\r
+# define SFR16(name, addr)      __sfr16 __at(((addr+1)<<8) | addr)      name\r
+# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr)                  name\r
 # define SFR32(name, addr)      __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name\r
-# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr)             name\r
+# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr)                  name\r
 \r
 /** Keil C51\r
   * http://www.keil.com\r
@@ -69,6 +75,7 @@
 #elif defined __CX51__\r
 # define SBIT(name, addr, bit)  sbit  name = addr^bit\r
 # define SFR(name, addr)        sfr   name = addr\r
+# define SFRX(name, addr)       volatile unsigned char xdata name _at_ addr\r
 # define SFR16(name, addr)      sfr16 name = addr\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
   * http://www.raisonance.com\r
  */\r
 #elif defined __RC51__\r
-# define SBIT(name, addr, bit)  at (addr+bit) sbit         name\r
-# define SFR(name, addr)        sfr at addr                name\r
-# define SFR16(name, addr)      sfr16 at addr              name\r
+# define SBIT(name, addr, bit)  at (addr+bit) sbit                   name\r
+# define SFR(name, addr)        sfr at addr                          name\r
+# define SFRX(name, addr)       xdata at addr volatile unsigned char name\r
+# define SFR16(name, addr)      sfr16 at addr                        name\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 # define SFR32E(name, fulladdr) /* not supported */\r
@@ -91,6 +99,7 @@
 #elif defined __ICC8051__\r
 # define SBIT(name, addr, bit)  __bit __no_init volatile bool name @ (addr+bit)\r
 # define SFR(name, addr)        __sfr __no_init volatile unsigned char name @ addr\r
+# define SFRX(name, addr)       __xdata __no_init volatile unsigned char name @ addr\r
 # define SFR16(name, addr)      __sfr __no_init volatile unsigned int  name @ addr\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  __sfr __no_init volatile unsigned long name @ addr\r
 #elif defined _CC51\r
 # define SBIT(name, addr, bit)  _sfrbit  name _at(addr+bit)\r
 # define SFR(name, addr)        _sfrbyte name _at(addr)\r
+# define SFRX(name, addr)       _xdat volatile unsigned char name _at(addr)\r
 # define SFR16(name, addr)      /* not supported */\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 #elif defined HI_TECH_C\r
 # define SBIT(name, addr, bit)  volatile bit           name @ (addr+bit)\r
 # define SFR(name, addr)        volatile unsigned char name @ addr\r
+# define SFRX(name, addr)       volatile far unsigned char name @ addr\r
 # define SFR16(name, addr)      /* not supported */\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 #elif defined _XC51_VER\r
 # define SBIT(name, addr, bit)  _sfrbit  name = (addr+bit)\r
 # define SFR(name, addr)        _sfr     name = addr\r
+# define SFRX(name, addr)       volatile unsigned char _xdata name _at addr\r
 # define SFR16(name, addr)      _sfrword name = addr\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 #elif defined __UC__\r
 # define SBIT(name, addr, bit)  unsigned char bit  name @ (addr+bit)\r
 # define SFR(name, addr)        near unsigned char name @ addr\r
+# define SFRX(name, addr)       xdata volatile unsigned char name @ addr\r
 # define SFR16(name, addr)      /* not supported */\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
   * unknown compiler\r
  */\r
 #elif\r
-# define SBIT(name, addr, bit)  volatile bool\r
-# define SFR(name, addr)        volatile unsigned char\r
-# define SFR16(name, addr)      volatile short\r
-# define SFR16E(name, fulladdr) volatile short\r
-# define SFR32(name, fulladdr)  volatile int\r
-# define SFR32E(name, fulladdr) volatile int\r
+# warning unknown compiler\r
+# define SBIT(name, addr, bit)  volatile bool           name\r
+# define SFR(name, addr)        volatile unsigned char  name\r
+# define SFRX(name, addr)       volatile unsigned char  name\r
+# define SFR16(name, addr)      volatile unsigned short name\r
+# define SFR16E(name, fulladdr) volatile unsigned short name\r
+# define SFR32(name, fulladdr)  volatile unsigned long  name\r
+# define SFR32E(name, fulladdr) volatile unsigned long  name\r
 \r
 #endif\r
 \r
index 4754095cc3149e75810537490d6a157143be309f..c1e5a44dc28435c56ede11266f3848221ff0879a 100644 (file)
@@ -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
index c41ff8661006c27ec851c40c8ef68489628003a6..0702e3b733428f6c1bda5a5082aa703dab8643b6 100644 (file)
@@ -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);
index f69b12c2f29f1385bc897c1d74ed0f9ce0e7e009..a6dfae4c4ab18df4d6ab1c1341f7cd85e39389c3 100644 (file)
@@ -124,8 +124,7 @@ allocReg (short type)
             currFunc->regsUsed = bitVectSetBit (currFunc->regsUsed, i);
           return &regs390[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 ();
             }