* src/pic/ralloc.c (newReg): create aliases for registers with
authortecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 28 Oct 2006 23:40:14 +0000 (23:40 +0000)
committertecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 28 Oct 2006 23:40:14 +0000 (23:40 +0000)
  multiple names to fix #1579535 and #1584001,
  (regWithIdx,dirregWithName): resolve aliases on lookup
* src/pic/pcode.c (DoBankSelect): die with error message on failing
  bankselect
* device/lib/pic/libdev/Makefile.in: move pseudo stack down to 0x4f
  to prevent build errors on small devices

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4441 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
device/lib/pic/libdev/Makefile.in
src/pic/pcode.c
src/pic/ralloc.c

index 79846934f9d9d6cd9063cd4e097599a1429edc8a..bafc801c00af6a85e980a2e41140072995ecd06a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-10-29 Raphael Neider <rneider AT web.de>
+
+       * src/pic/ralloc.c (newReg): create aliases for registers with
+         multiple names to fix #1579535 and #1584001,
+         (regWithIdx,dirregWithName): resolve aliases on lookup
+       * src/pic/pcode.c (DoBankSelect): die with error message on failing
+         bankselect
+       * device/lib/pic/libdev/Makefile.in: move pseudo stack down to 0x4f
+         to prevent build errors on small devices
+
 2006-10-28 Raphael Neider <rneider AT web.de>
 
        * src/pic/gen.c (genFunction,genCall): drop "same code page"
index cf9bc296cb973fcaa185da228ad82da5978767dc..288edf937e64c3a7b136af1138d95075004aaadf 100644 (file)
@@ -27,7 +27,7 @@ pic%.c : $(GPUTILS)/header/p%.inc
 endif
 
 pic%.o : pic%.c
-       -$(CC) $(CPPFLAGS) $(CFLAGS) -mpic14 -p$* -o "$@" -c "$<"
+       -$(CC) $(CPPFLAGS) $(CFLAGS) -mpic14 -p$* --stack-loc 0x4f -o "$@" -c "$<"
 
 $(INSTALL_DIR)/%.lib : %.o
        -$(LIB) -c "$@" "$<";
index fe75ecf7e7baa54739a394cf50c3e9e388577b68..c37d6ff85359a323aaba0e2892a1e7fb0bdc0eba 100644 (file)
@@ -4755,6 +4755,11 @@ static int DoBankSelect(pCode *pc, int cur_bank) {
        }
        
        reg = getRegFromInstruction(pc);
+       if (!reg && isPCI(pc) &&
+               ((PCI(pc)->inCond | PCI(pc)->outCond) & PCC_REGISTER))
+       {
+           assert(!"Could not get register from instruction.");
+       }
        if (reg) {
                if (IsBankChange(pc,reg,&cur_bank))
                        return cur_bank;
index a73247fd161fef1266f822a5e722d948b613e5e2..010ebaffc72e8d8467b353bb0f99793d64131762 100644 (file)
@@ -343,22 +343,20 @@ static regs *regWithIdx (set *dRegs, int idx, int fixed);
 static regs* newReg(short type, PIC_OPTYPE pc_type, int rIdx, char *name, int size, int alias)
 {
        
-       regs *dReg;
+       regs *dReg, *reg_alias;
 
        /* check whether a matching register already exists */
        dReg = dirregWithName( name );
        if (dReg) {
-         //printf( "%s: already present: %s\n", __FUNCTION__, name );
-         return (dReg);
-       }
-       dReg = regWithIdx( dynDirectRegs, rIdx, 0 );
-       if (!dReg) dReg = regWithIdx( dynDirectRegs, rIdx, 1 );
-       if (dReg)
-       {
-         //printf(  "%s: already present %s (idx:%d/%x)", __FUNCTION__, name, rIdx, rIdx );
-         return (dReg);
+               //printf( "%s: already present: %s\n", __FUNCTION__, name );
+               return (dReg);
        }
        
+       // check whether a register at that location exists
+       reg_alias = regWithIdx( dynDirectRegs, rIdx, 0 );
+       if (!reg_alias) reg_alias = regWithIdx( dynDirectRegs, rIdx, 1 );
+       
+       // create a new register
        dReg = Safe_calloc(1,sizeof(regs));
        dReg->type = type;
        dReg->pc_type = pc_type;
@@ -383,18 +381,12 @@ static regs* newReg(short type, PIC_OPTYPE pc_type, int rIdx, char *name, int si
        dReg->address = 0;
        dReg->size = size;
        dReg->alias = alias;
-       dReg->reg_alias = NULL;
+       dReg->reg_alias = reg_alias;
        dReg->reglives.usedpFlows = newSet();
        dReg->reglives.assignedpFlows = newSet();
-       
        hTabAddItem(&dynDirectRegNames, regname2key(dReg->name), dReg);
-#ifdef __GNUC__
-       debugLog( "%s: Created register %s (%p).\n",
-               __FUNCTION__, dReg->name, __builtin_return_address(0) );
-#else
-       debugLog( "%s: Created register %s.\n",
-               __FUNCTION__, dReg->name);
-#endif
+       debugLog( "%s: Created register %s.\n", __FUNCTION__, dReg->name);
+       
        return dReg;
 }
 
@@ -410,6 +402,7 @@ regWithIdx (set *dRegs, int idx, int fixed)
        dReg = setNextItem(dRegs)) {
                
                if(idx == dReg->rIdx && (fixed == (int)dReg->isFixed)) {
+                       while (dReg->reg_alias) dReg = dReg->reg_alias;
                        return dReg;
                }
        }
@@ -590,6 +583,8 @@ dirregWithName (char *name)
        while(reg) {
                
                if(STRCASECMP(reg->name, name) == 0) {
+                       // handle registers with multiple names
+                       while (reg->reg_alias) reg = reg->reg_alias;
                        return(reg);
                }