Hi all,
I found a issue in the optimization part of gcc-avr.
(I'm new to this stuff so be patient :) )
I'm losing some data returned from a function,
Attaching the smallest example, I could find.
Similarly bug occurs in the ArduinoISP example,
function program_page().
code:
unsigned char getch();
int f()
{
int a;
unsigned char c2;
a = getch();
a *= 256; //!! bug - getch() value disappears
c2 = getch();
a += c2;
return a;
}
output:
int f()
{
0: ef 92 push r14
2: ff 92 push r15
4: cf 93 push r28
6: df 93 push r29
int a;
unsigned char c2;
a = getch();
8: 0e 94 00 00 call 0 ; 0x0 <_Z1fv>
a *= 256; //!! bug - getch() value disappears
c: 80 e0 ldi r24, 0x00 ; 0
e: ec 01 movw r28, r24
c2 = getch();
10: 0e 94 00 00 call 0 ; 0x0 <_Z1fv>
a += c2;
14: c8 0f add r28, r24
16: d1 1d adc r29, r1
return a;
}
18: ce 01 movw r24, r28
1a: df 91 pop r29
1c: cf 91 pop r28
1e: ff 90 pop r15
20: ef 90 pop r14
22: 08 95 ret
some info:
system ubuntu 11.10 amd64
#avr-g++ -mmcu=atmega1280 -g -Os -c b.cpp
#avr-objdump -S -d b.o > b.asm
#avr-g++ -v
Using built-in specs.
COLLECT_GCC=avr-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.3/lto-wrapper
Target: avr
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --disable-libssp --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=avr
Thread model: single
gcc version 4.5.3 (GCC)
Best regards
Paweł,
_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@...
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list