From: Johan K. <joh...@id...> - 2001-11-05 13:57:31
|
> void > fptr(void (*fp)(void)) > { > int i; > for (i = 0; i < 50; i++) > (*fp)(); > } > > fails as the registers assigned to the local copy of fp are > not saved across the call. Visible on the z80 and mcs51 > stack based ports. I'm looking into the z80 port. saveRegisters() saved registeres that were in use (ic->rMask), but excluded the ones used in this icode (ic->rUsed). Only a PCALL uses registers for IC_LEFT(ic) and those were excluded as well. So I changed it (mcs51 only) to exclude only the registers used for IC_RESULT(ic). An additional check should be made to see if the live range of IC_LEFT(ic) ends here in which case it doesn't need to be saved either. If I figured that out, ds390 and pic can follow. The Z80 port already had something like this in gen.c:1.61 but for some reason it isn't there anymore. I don't feel comfortable changing it there, I could find a _saveRegsForCall but not the corresponding _unsaveRegsForCall. So I'd rather have Micheal to look at this. I couldn't find either of them in the AVR port. Now an new problem is that because of the extra push/pop, testfwk.c won't compile anymore for mcs51 because of a jmp out of range. I thought that was fixed a long time ago, anyone? The additional check mentioned before would prevent that, but than the offset would still be 0x84 which is extremely dangerous. Johan |