From: tecodev Date: Sat, 28 Oct 2006 23:40:14 +0000 (+0000) Subject: * src/pic/ralloc.c (newReg): create aliases for registers with X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=ccadc6c89f74c72232dc551f6d7047285c658b7f;p=fw%2Fsdcc * 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 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4441 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 79846934..bafc801c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-10-29 Raphael Neider + + * 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 * src/pic/gen.c (genFunction,genCall): drop "same code page" diff --git a/device/lib/pic/libdev/Makefile.in b/device/lib/pic/libdev/Makefile.in index cf9bc296..288edf93 100644 --- a/device/lib/pic/libdev/Makefile.in +++ b/device/lib/pic/libdev/Makefile.in @@ -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 "$@" "$<"; diff --git a/src/pic/pcode.c b/src/pic/pcode.c index fe75ecf7..c37d6ff8 100644 --- a/src/pic/pcode.c +++ b/src/pic/pcode.c @@ -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; diff --git a/src/pic/ralloc.c b/src/pic/ralloc.c index a73247fd..010ebaff 100644 --- a/src/pic/ralloc.c +++ b/src/pic/ralloc.c @@ -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); }