From: SourceForge.net <no...@so...> - 2009-06-21 22:38:14
|
Bugs item #2810015, was opened at 2009-06-22 01:38 Message generated for change (Tracker Item Submitted) made by jmosalmi You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2810015&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: pic14 target Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Juho Salminen (jmosalmi) Assigned to: Nobody/Anonymous (nobody) Summary: Register incorrectly reused Initial Comment: When compiling the source file attached (test.c) for pic14 target, a register used for a variable in function main() gets incorrectly reused in function func(). I tried to simplify the code as much as possible, so the program actually does nothing sensible; however, the problem should be clearly visible. If required, I can also attach the original source that I first discovered the problem in. Desciption of the problem: There are 5 compiler-assigned registers for the function main(). The variable 'a' is assigned the register r0x1008. In function func(), the register r0x1008 is also compiler-assigned and its value is clobbered in that function (by the instruction MOVWF r0x1008). Therefore, upon return from func(), the value of 'a' is changed. The register being overwritten seems to be the first one assigned in main() and the last one assigned in func(), if that matters. SDCC version: SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.9.1 #5469 (Jun 22 2009) (UNIX) The command I use to compile this file: $ sdcc -p16f628 -mpic14 test.c (If I use $ sdcc --nooverlay -p16f628 -mpic14 test.c instead, the problem is the same except that the problematic register is now r0x104F.) No other registers seem to overlap when compiling test.c, nor when compiling the original, more complicated source. Thank you for your efforts! BR, Juho Salminen ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2810015&group_id=599 |
From: SourceForge.net <no...@so...> - 2009-06-23 22:45:06
|
Bugs item #2810015, was opened at 2009-06-21 22:38 Message generated for change (Comment added) made by tecodev You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2810015&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: pic14 target >Group: fixed >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: Juho Salminen (jmosalmi) Assigned to: Nobody/Anonymous (nobody) Summary: Register incorrectly reused Initial Comment: When compiling the source file attached (test.c) for pic14 target, a register used for a variable in function main() gets incorrectly reused in function func(). I tried to simplify the code as much as possible, so the program actually does nothing sensible; however, the problem should be clearly visible. If required, I can also attach the original source that I first discovered the problem in. Desciption of the problem: There are 5 compiler-assigned registers for the function main(). The variable 'a' is assigned the register r0x1008. In function func(), the register r0x1008 is also compiler-assigned and its value is clobbered in that function (by the instruction MOVWF r0x1008). Therefore, upon return from func(), the value of 'a' is changed. The register being overwritten seems to be the first one assigned in main() and the last one assigned in func(), if that matters. SDCC version: SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.9.1 #5469 (Jun 22 2009) (UNIX) The command I use to compile this file: $ sdcc -p16f628 -mpic14 test.c (If I use $ sdcc --nooverlay -p16f628 -mpic14 test.c instead, the problem is the same except that the problematic register is now r0x104F.) No other registers seem to overlap when compiling test.c, nor when compiling the original, more complicated source. Thank you for your efforts! BR, Juho Salminen ---------------------------------------------------------------------- >Comment By: Raphael Neider (tecodev) Date: 2009-06-23 22:45 Message: Fixed in r5471. The problem was not the infamous overlay optimization, but an incorrect register assignment beforehand: Now, all functions are given a fresh set of registers, which can later be overlaid. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2810015&group_id=599 |