From: SourceForge.net <no...@so...> - 2003-12-15 18:57:52
|
Bugs item #860505, was opened at 2003-12-15 10:57 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=860505&group_id=599 Category: Live range problems Group: None Status: Open Resolution: None Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: Serious miscompilation of 8051 code Initial Comment: A function had me confused for hours, until I traced it to a compiler code generation bug. I have reduced the code to a small example which still displays the bug. This is the code: static void test (xdata char * ptr) { unsigned char i; while (1) { for (i = 0; i < 1; i++) *ptr = 0; for (i = 0; i < 1; i++) {} } } It is compiled with this command: sdcc -S test.c This is the output from "sdcc --version": SDCC : mcs51/gbz80/z80/avr/ds390/pic14/pic16/TININative/xa51/ds400 2.3.5 (Oct 11 2003) (UNIX) The bug is clear from the generated asm code, which is below. Take a close look at the register "r2". It holds part of the "ptr" variable, but it is incorrectly clobbered by the second "for" loop's index. By the second iteration of the "while", "ptr" has the wrong value and "*ptr = 0" stores to the wrong address. Also see that a data memory location is assigned called "_test_ptr_1_1", but this is not actually referenced anywhere in the code. I suspect this is significant, because I've only seen this bug with variables which are function parameters. Quite a few source variations are miscompiled in this way; it's quite a robust bug. Here is the asm: ;-------------------------------------------------------- ; internal ram data ;-------------------------------------------------------- .area DSEG (DATA) _test_ptr_1_1: .ds 2 ;------------------------------------------------------------ ;Allocation info for local variables in function 'test' ;------------------------------------------------------------ ;ptr Allocated to in memory with name '_test_ptr_1_1' ;------------------------------------------------------------ ;test.c:1: static void test (xdata char * ptr) ; ----------------------------------------- ; function test ; ----------------------------------------- _test: ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 ; genReceive mov r2,dpl mov r3,dph ;test.c:5: for (i = 0; i < 1; i++) 00112$: ; genAssign mov r4,#0x01 00106$: ;test.c:6: *ptr = 0; ; genPointerSet ; genFarPointerSet mov dpl,r2 mov dph,r3 ; Peephole 181 changed mov to clr clr a movx @dptr,a ; genDjnz ; Peephole 132 changed ljmp to sjmp ; Peephole 205 optimized misc jump sequence djnz r4,00106$ 00117$: 00118$: ;test.c:5: for (i = 0; i < 1; i++) ;test.c:7: for (i = 0; i < 1; i++) {} ; genAssign mov r2,#0x01 00109$: ; genDjnz ; Peephole 132 changed ljmp to sjmp ; Peephole 205 optimized misc jump sequence djnz r2,00109$ 00119$: 00120$: ; Peephole 132 changed ljmp to sjmp sjmp 00112$ 00110$: ret Thanks, -- Jamie Lokier <ja...@sh...> ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=860505&group_id=599 |