From: <no...@so...> - 2001-10-29 18:15:41
|
Bugs item #476089, was opened at 2001-10-29 10:15 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=100599&aid=476089&group_id=599 Category: msc51(8051) target Group: None Status: Open Resolution: None Priority: 5 Submitted By: Alex Karahalios (karahalios) Assigned to: Nobody/Anonymous (nobody) Summary: Incorrect code gen. for "extern const" Initial Comment: For: SDCC : mcs51/gbz80/z80/avr/ds390/pic14/i186/tlcs900h 2.3.1 (10/17/01) (UNIX) When declaring extern const arrays, the compiler does not generate the correct code when passing the address of the array to a function. The code: extern const unsigned char eData[2]; const unsigned char lData[2] = {1,2}; void func (unsigned char *p); void main () { func(&eData); func(&lData); } Generates the following asm code: ; bug.c 5 mov r2,#_eData mov r3,#0x00 mov r4,#0x00 mov dpl,r2 mov dph,r3 mov b,r4 lcall _func ; bug.c 6 mov r2,#_lData mov r3,#(_lData >> 8) mov r4,#0x02 mov dpl,r2 mov dph,r3 mov b,r4 lcall _func As you can see the pointer value and type passed for _eData is incorrect. A temporary workaround is to explicitly declare the data as code: extern code const unsigned char eData[2]; This bug may also manifest itself with structures, but I have not investigated it. Thanks, Alex Karahalios ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=100599&aid=476089&group_id=599 |
From: Johan K. <joh...@id...> - 2001-10-30 13:29:56
|
Right, fixed in SDCCsymt.c:1.107 where SPEC_CONST wasn't joining the party. Please remember that global consts are in CSEG, but local consts only if they are static. Don't know why, but that was the outcome of a previous discussion. Perhaps we need to discuss that again? Johan ----- Original Message ----- From: <no...@so...> To: <no...@so...> Sent: Monday, October 29, 2001 7:15 PM Subject: [sdcc-devel] [ sdcc-Bugs-476089 ] Incorrect code gen. for "extern const" > Bugs item #476089, was opened at 2001-10-29 10:15 > You can respond by visiting: > http://sourceforge.net/tracker/?func=detail&atid=100599&aid=476089&group_id= 599 > > Category: msc51(8051) target > Group: None > Status: Open > Resolution: None > Priority: 5 > Submitted By: Alex Karahalios (karahalios) > Assigned to: Nobody/Anonymous (nobody) > Summary: Incorrect code gen. for "extern const" > > Initial Comment: > For: SDCC : mcs51/gbz80/z80/avr/ds390/pic14/i186/tlcs900h 2.3.1 (10/17/01) (UNIX) > > When declaring extern const arrays, the compiler does not generate the correct code when passing the address of the array to a function. The code: > > extern const unsigned char eData[2]; > const unsigned char lData[2] = {1,2}; > void func (unsigned char *p); > void main () { > func(&eData); > func(&lData); > } > > Generates the following asm code: > > ; bug.c 5 > mov r2,#_eData > mov r3,#0x00 > mov r4,#0x00 > mov dpl,r2 > mov dph,r3 > mov b,r4 > lcall _func > ; bug.c 6 > mov r2,#_lData > mov r3,#(_lData >> 8) > mov r4,#0x02 > mov dpl,r2 > mov dph,r3 > mov b,r4 > lcall _func > > As you can see the pointer value and type passed for _eData is incorrect. A temporary workaround is to explicitly declare the data as code: > > extern code const unsigned char eData[2]; > > This bug may also manifest itself with structures, but I have not investigated it. > > Thanks, > > Alex Karahalios > > > ---------------------------------------------------------------------- > > You can respond by visiting: > http://sourceforge.net/tracker/?func=detail&atid=100599&aid=476089&group_id= 599 > > _______________________________________________ > sdcc-devel mailing list > sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-devel > |