you didn't assign anything to ptr1. so *ptr1++ = *ptr2++; is undefined.
On Sat, Aug 9, 2014 at 3:51 PM, Thomas D. Dean <tomd...@speakeasy.net> wrote: > Is this a problem with -Os? > > It looks like the compiler has decided that cs is always zero in the code > below. The cs calculation appears correct. > > In spi_copy.c > > ... > uint8_t spi_copy_in(uint8_t *dest, uint8_t *source, unsigned int max_len) { > uint8_t cs; > uint8_t len; > uint8_t *ptr1, *ptr2; > > cs = 0; > len = source[0]; > if (len > max_len) return 0xff; > ptr2 = &source[1]; > do { > cs += *ptr2++; > } while (--len); > if (cs == 0) { > len = source[0] - 1; // do not need the checksum > ptr2 = &source[1]; > do { > *ptr1++ = *ptr2++; > } while (--len); > } > return cs; > } > ... > > > make > ... > avr-gcc -Os -Wall -Wmissing-prototypes -fno-strict-aliasing -Wall > -I../include -I../../Class -mmcu=atmega128 -c -o spi_copy.o > ../../Class/spi_copy.c > ... > > > avr-objdump -d ng02.elf | more > ... > > 0000077c <spi_copy_in>: > 77c: fb 01 movw r30, r22 > 77e: 20 81 ld r18, Z > 780: 82 2f mov r24, r18 > 782: 90 e0 ldi r25, 0x00 ; 0 > 784: 48 17 cp r20, r24 > 786: 59 07 cpc r21, r25 > 788: 38 f0 brcs .+14 ; 0x798 <spi_copy_in+0x1c> > 78a: 31 96 adiw r30, 0x01 ; 1 > 78c: 80 e0 ldi r24, 0x00 ; 0 > 78e: 91 91 ld r25, Z+ > 790: 89 0f add r24, r25 > 792: 21 50 subi r18, 0x01 ; 1 > 794: e1 f7 brne .-8 ; 0x78e <spi_copy_in+0x12> > 796: 08 95 ret > 798: 8f ef ldi r24, 0xFF ; 255 > 79a: 08 95 ret > > Tom Dean > > _______________________________________________ > AVR-GCC-list mailing list > AVR-GCC-list@nongnu.org > https://lists.nongnu.org/mailman/listinfo/avr-gcc-list >
_______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-gcc-list