From: SourceForge.net <no...@so...> - 2006-11-22 10:04:27
|
Bugs item #1601032, was opened at 2006-11-22 10:04 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1601032&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: hc08 port Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Idris Roker (idrisroker) Assigned to: Nobody/Anonymous (nobody) Summary: incorrect code generated for function pointer call Initial Comment: using: SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.6.0 #4309 (Oct 18 2006) (UNIX) Command: sdcc -mhc08 --stack-auto -c testcall.c The assembly code generated for a function call via a function pointer uses incorrect stack offsets. The call is made indirectly via a call to a compiler-generated local subroutine. What appears to be happening is that the compiler does not take into account the fact that the call to the local subroutine results in an extra 2 bytes being placed on the stack (the return address for the local subroutine call). All stack offsets in the local subroutine are therefore 2 bytes less than they should be. The 2-byte offset is used in the code following the local subroutine (executed after the return from the function) but this is also erroneous as the entire stack frame for the function call, including the return address of the local subroutine, has been erased by this point. All stack offsets following the call are therefore 2 bytes more than they should be. I'm uploading a test file "testcall.c" to illustrate the problem. The following is a snippet of the relevant portion of the generated assembly file for the test file, showing where the problems are: ;testcall.c:25: d = fp (a, b, c, d); lda 3,s ;@@ these offsets are correct psha lda 5,s psha bsr 00104$ ;@@ this pushes 2 bytes on the stack which seems to throw the rest out bra 00103$ 00104$: lda 4,s ;@@ these offsets are 2 LESS than they should be psha lda 4,s psha lda 10,s ldx 9,s rts 00103$: ais #2 sta 5,s ;@@ all following offsets are 2 MORE than they should be ;testcall.c:28: ga = a+b; lda 8,s add 7,s sta _ga ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1601032&group_id=599 |
From: SourceForge.net <no...@so...> - 2006-11-24 05:06:59
|
Bugs item #1601032, was opened at 2006-11-22 04:04 Message generated for change (Comment added) made by epetrich You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1601032&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: hc08 port >Group: fixed >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: Idris Roker (idrisroker) >Assigned to: Erik Petrich (epetrich) Summary: incorrect code generated for function pointer call Initial Comment: using: SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.6.0 #4309 (Oct 18 2006) (UNIX) Command: sdcc -mhc08 --stack-auto -c testcall.c The assembly code generated for a function call via a function pointer uses incorrect stack offsets. The call is made indirectly via a call to a compiler-generated local subroutine. What appears to be happening is that the compiler does not take into account the fact that the call to the local subroutine results in an extra 2 bytes being placed on the stack (the return address for the local subroutine call). All stack offsets in the local subroutine are therefore 2 bytes less than they should be. The 2-byte offset is used in the code following the local subroutine (executed after the return from the function) but this is also erroneous as the entire stack frame for the function call, including the return address of the local subroutine, has been erased by this point. All stack offsets following the call are therefore 2 bytes more than they should be. I'm uploading a test file "testcall.c" to illustrate the problem. The following is a snippet of the relevant portion of the generated assembly file for the test file, showing where the problems are: ;testcall.c:25: d = fp (a, b, c, d); lda 3,s ;@@ these offsets are correct psha lda 5,s psha bsr 00104$ ;@@ this pushes 2 bytes on the stack which seems to throw the rest out bra 00103$ 00104$: lda 4,s ;@@ these offsets are 2 LESS than they should be psha lda 4,s psha lda 10,s ldx 9,s rts 00103$: ais #2 sta 5,s ;@@ all following offsets are 2 MORE than they should be ;testcall.c:28: ga = a+b; lda 8,s add 7,s sta _ga ---------------------------------------------------------------------- >Comment By: Erik Petrich (epetrich) Date: 2006-11-23 23:06 Message: Logged In: YES user_id=635249 Originator: NO Fixed in SDCC #4482 ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1601032&group_id=599 |