+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"
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;
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;
}
dReg = setNextItem(dRegs)) {
if(idx == dReg->rIdx && (fixed == (int)dReg->isFixed)) {
+ while (dReg->reg_alias) dReg = dReg->reg_alias;
return dReg;
}
}
while(reg) {
if(STRCASECMP(reg->name, name) == 0) {
+ // handle registers with multiple names
+ while (reg->reg_alias) reg = reg->reg_alias;
return(reg);
}